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.xxrange
会比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)
它不需要在内部循环中每次都构造range
s。我还将您对range
的使用切换为xrange
,因为它更适合大范围,尽管这与product
确实无关。
@JohnZ 的问题很好——如果您的“预定大小值”非常大,特别是如果 vs
也很大,您可能正在构建一些较大的值,而 @987654329 可能需要很长时间@ 来处理它们。
我怀疑循环本身正在变慢,但数字越来越大,所以你的计算可能是。
【讨论】:
另外,在这个例子中,我的“预定尺寸值”是每个 20。 但这就是奇怪的事情 - for 循环应该保持稳定的速度,不是吗?随着时间的推移,它肯定会变得越来越慢...... 如果它变慢了,那是因为你在Cube
中所做的事情,因为值变得非常大,或者因为与循环并行的其他事情。没有其他解释。 Python 中的循环不会“变慢”。
当您说“出于本示例的目的”时,您的意思是您实际测试了这个循环,将xs
等设置为20
并看到了减速?因为这似乎没有任何意义——对于很小的值(8000 次迭代),循环根本不需要时间。
这似乎对一些人有所帮助。感谢那!它仍然随着时间的推移而变慢,但我正在访问一个我要附加到的全局字典,所以这种速度可能会变慢。【参考方案2】:
我能想到的三件事:
内存 - 如果您将所有生成的值存储在某处,则循环可能会因为正在使用的所有内存而变慢。 Python 有自己的内存管理器,因此用尽大量内存最终可能会使程序变慢。
计算的复杂性 - Python 使用任意精度的数值数据类型。如果您将非常大的数字相乘(尤其是浮点数),程序会变慢。这实际上取决于这些值有多大。
Cube - 这可能是 Cube 代码中的错误(尽管我确信它可能就像听起来一样简单)。
【讨论】:
以上是关于Python For 循环随时间变慢的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法绕过 Python list.append() 随着列表的增长而在循环中逐渐变慢?