Python For 循环随时间变慢

Posted

技术标签:

【中文标题】Python For 循环随时间变慢【英文标题】:Python For Loop Slowing With Time 【发布时间】:2011-10-31 11:03:48 【问题描述】:

所以我在处理 Python 中的 for 循环时遇到了一些麻烦——据我所知,它们随着时间的推移变得越来越慢。我在一个范围内的范围内循环,随着时间的推移,循环明显变慢。如果重要的话,这是在游戏引擎内部完成的。谁能告诉我是什么问题?

这是一个简单的例子。

for x in range(xs): # xs, ys, and zs are all pre-determined size values

     for z in range(zs):

          for y in range(ys):

              vp = [x * vs, y * vs, z * vs]

              v = Cube(vp)

这个过程的初始速度很好,但随着时间的推移循环变慢。我知道它与游戏引擎的光栅化器不同,因为当循环完成时,引擎的其余部分以 60 FPS 运行。那么可能是什么问题呢?

编辑:我使用的是 Python 3,所以没有 xrange。

编辑 2:对于本例,vs 为 1.0,xs、ys 和 zs 的预定大小值均为 20。

【问题讨论】:

你的三个循环参数xs、ys和zs有多大? 如果你注释掉循环内的两行中的任何一行怎么办? 如果你使用python 2.x xrange会比range 抱歉,我会提供更多信息。 您如何衡量“初始速度”与“随时间变慢”?我们是在讨论所示代码的单次运行中的迭代,还是在讨论所示代码的连续运行?如果是前者,您如何衡量流程的完成百分比? 【参考方案1】:

这是“需要更多信息”的另一种情况。然而,Python 有一个标准的方式来高效地构建这样的嵌套循环,itertools.product

from itertools import product

for x, y, z in product(xrange(xs), xrange(zs), xrange(ys)):
    vp = [x * vs, y * vs, z * vs]
    v = Cube(vp)

它不需要在内部循环中每次都构造ranges。我还将您对range 的使用切换为xrange,因为它更适合大范围,尽管这与product 确实无关。

@JohnZ 的问题很好——如果您的“预定大小值”非常大,特别是如果 vs 也很大,您可能正在构建一些较大的值,而 @987654329 可能需要很长时间@ 来处理它们。

我怀疑循环本身正在变慢,但数字越来越大,所以你的计算可能是。

【讨论】:

另外,在这个例子中,我的“预定尺寸值”是每个 20。 但这就是奇怪的事情 - for 循环应该保持稳定的速度,不是吗?随着时间的推移,它肯定会变得越来越慢...... 如果它变慢了,那是因为你在 Cube 中所做的事情,因为值变得非常大,或者因为与循环并行的其他事情。没有其他解释。 Python 中的循环不会“变慢”。 当您说“出于本示例的目的”时,您的意思是您实际测试了这个循环,将xs 等设置为20 并看到了减速?因为这似乎没有任何意义——对于很小的值(8000 次迭代),循环根本不需要时间。 这似乎对一些人有所帮助。感谢那!它仍然随着时间的推移而变慢,但我正在访问一个我要附加到的全局字典,所以这种速度可能会变慢。【参考方案2】:

我能想到的三件事:

内存 - 如果您将所有生成的值存储在某处,则循环可能会因为正在使用的所有内存而变慢。 Python 有自己的内存管理器,因此用尽大量内存最终可能会使程序变慢。

计算的复杂性 - Python 使用任意精度的数值数据类型。如果您将非常大的数字相乘(尤其是浮点数),程序会变慢。这实际上取决于这些值有多大。

Cube - 这可能是 Cube 代码中的错误(尽管我确信它可能就像听起来一样简单)。

【讨论】:

以上是关于Python For 循环随时间变慢的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法绕过 Python list.append() 随着列表的增长而在循环中逐渐变慢?

为啥排序时 Python 列表会变慢?

AVCaptureVideoPreviewLayer 运行速度随时间变慢

循环拆分使代码变慢

如何减少运行(for循环),Python

python中for循环的用法