在C+上的Python循环中创建for循环+;对象和方法更有效

在C+上的Python循环中创建for循环+;对象和方法更有效,python,c++,for-loop,Python,C++,For Loop,我正在寻找一些for循环的性能改进 基本上,我在一个包含一些数据的字典(Dict)上循环以绘制图表。用于绘图的模块是root(C++中实现的高能物理框架,这里不重要)。 字典包含+100k个值,对于每个值,range()参数通常为1-150,这意味着range()循环被多次调用。 Python中的根模块基本上是一个链接到root的C++实现的字典,这样对于Range()循环中的每个循环,代码挑选出一个C++对象(CeS2D),并将一个C++方法(填充(,))应用到它。 因此,如果我们现在忽略整个

我正在寻找一些for循环的性能改进

基本上,我在一个包含一些数据的字典(Dict)上循环以绘制图表。用于绘图的模块是root(C++中实现的高能物理框架,这里不重要)。 字典包含+100k个值,对于每个值,range()参数通常为1-150,这意味着range()循环被多次调用。 Python中的根模块基本上是一个链接到root的C++实现的字典,这样对于Range()循环中的每个循环,代码挑选出一个C++对象(CeS2D),并将一个C++方法(填充(,))应用到它。 因此,如果我们现在忽略整个根模块,有没有办法使我的range()循环更高效?对于100k值,所需时间约为10-15秒,但如果有更多数据,则时间明显增加

for item in list:

    for index in Dict[item]:

        if Dict[item][index] == 0:  
            continue

        for n in range(int(Dict[item][index] * FillQuantityFactor)):  
            # Fill ROOT histogram
            hist2D.Fill(item, index)
< P>我猜一个问题是,在每个范围(例如,假设范围是150)循环中,C++对象的组2D被调用150次,而我们只需要调用它1次,只使用该方法150次。 所以,如果不深入分析我的分析模块(root)的C++,我能做什么来加快这个代码? 我想使用xrange而不是range也会有帮助


非常感谢

如果您只是使用range()为for循环获取一个数字,那么xrange应该可以节省一些时间,是的。你有你正在使用的python根模块的文档吗?有,但我认为它不会带你去任何地方,因为它是一个相当庞大的框架(,参考指南:)。我使用的根方法是一种(必要的)变通方法。那么“调用150次”呢,我说得对吗?我不确定在python中不引用对象就可以调用对象的方法。不幸的是,我对C/C++不是很熟悉,所以我不能真正帮助你,抱歉。前面的评论是正确的。使用xrange和尽可能多的其他发电机。这里有一个经典的n²循环,所以除非你以某种方式改变它,否则它永远不会变得很快。你可以编写一些C++来与root交互,然后使用SWIG来生成一些Python绑定。但是在这个小代码示例中,我不能使用更多的生成器,或者不使用?如果你只是使用Range()来获得for for循环的数字,那么XRead应该剃掉一些时间,是的。你有你正在使用的python根模块的文档吗?有,但我认为它不会带你去任何地方,因为它是一个相当庞大的框架(,参考指南:)。我使用的根方法是一种(必要的)变通方法。那么“调用150次”呢,我说得对吗?我不确定在python中不引用对象就可以调用对象的方法。不幸的是,我对C/C++不是很熟悉,所以我不能真正帮助你,抱歉。前面的评论是正确的。使用xrange和尽可能多的其他发电机。这里有一个经典的n²循环,所以除非你以某种方式改变它,否则它永远不会变得很快。你可以编写一些C++来与root交互,然后使用SWIG来生成所有的Python绑定。但是我想在这个小代码示例中,我不能使用更多的生成器,或者不是?