Python 中的 for 循环随时间变慢

10 投票
2 回答
9526 浏览
提问于 2025-04-17 00:02

我在用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 个回答

1

我想到三件事:

内存 - 如果你把所有生成的值都存储在某个地方,循环可能会变慢,因为使用的内存太多了。Python有自己的内存管理系统,所以如果占用太多内存,程序可能会变得更慢。

计算复杂度 - Python使用的是任意精度的数字数据类型。如果你在乘非常大的数字(特别是小数),程序会变得很慢。这主要取决于这些数字有多大。

Cube - 可能是Cube代码中的一个bug(不过我相信这可能只是个简单的问题)。

16

这又是一个需要更多信息的情况。不过,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 处理它们可能会花很长时间。

我怀疑循环本身并没有变慢,但数字在变大,所以你的计算可能会变得慢。

撰写回答