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)

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

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

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

这又是一个"需要更多信息"的例子。然而,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也很大,你可能会构造一些大的值,Cube可能会花很长时间来处理它们。

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

我能想到的三件事:

内存——如果你把所有生成的值都存储在某个地方,循环可能会变慢,因为所有的内存都被使用了。Python有自己的内存管理器,所以使用大量内存最终会使程序变慢。

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

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

最新更新