【问题标题】:Python For Loop Slowing With TimePython For 循环随时间变慢
【发布时间】: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
  • 抱歉,我会提供更多信息。
  • 您如何衡量“初始速度”与“随时间变慢”?我们是在讨论所示代码的单次运行中的迭代,还是在讨论所示代码的连续运行?如果是前者,您如何衡量流程的完成百分比?

标签: python performance for-loop python-3.x 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 代码中的错误(尽管我确信它可能就像听起来一样简单)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2014-07-27
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多