Python 中的 for 循环随时间变慢
我在用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帧每秒。那么问题可能出在哪里呢?
补充说明:我用的是Python 3,所以没有xrange这个东西。
补充说明2:在这个例子中,vs是1.0,xs、ys和zs的预设大小值都是20。
2 个回答
我想到三件事:
内存 - 如果你把所有生成的值都存储在某个地方,循环可能会变慢,因为使用的内存太多了。Python有自己的内存管理系统,所以如果占用太多内存,程序可能会变得更慢。
计算复杂度 - Python使用的是任意精度的数字数据类型。如果你在乘非常大的数字(特别是小数),程序会变得很慢。这主要取决于这些数字有多大。
Cube - 可能是Cube代码中的一个bug(不过我相信这可能只是个简单的问题)。
这又是一个需要更多信息的情况。不过,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
。我还把你用的 range
换成了 xrange
,因为在处理大范围时 xrange
更好,虽然在使用 product
时这其实没什么关系。
@JohnZ 的问题很好——如果你的“预设大小值”非常大,尤其是如果 vs
也很大,你可能会生成一些很大的值,这样 Cube
处理它们可能会花很长时间。
我怀疑循环本身并没有变慢,但数字在变大,所以你的计算可能会变得慢。