2011-08-21 76 views
7

所以我在處理Python中的循環時遇到了一些麻煩 - 據我所知,它們隨着時間變慢。我正在循環範圍內的一個範圍內,隨着時間的推移,循環明顯變慢。這是在遊戲引擎內完成的,如果它很重要的話。有誰能告訴我這是什麼問題嗎?Python For Loop隨着時間的流逝而加速

下面是一個簡單的例子。

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.

+5

您的三個循環參數xs,ys和zs有多大? –

+0

如果你註釋掉循環中的兩條線,該怎麼辦? – jtbandes

+0

如果你正在使用python 2.x'xrange'會比'range'更快# – GWW

回答

13

這是「需要更多的信息」另一種情況。然而,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,因爲它對大範圍更好,但這與product無關。

@ JohnZ的問題是好的 - 如果你的「預定大小值」是非常大的,特別是如果vs也大,你可以建造一些大的值,它可以採取很長時間Cube處理他們。

我懷疑循環本身正在放緩,但數字越來越大,所以你的計算可能是。

+0

vs實際上是1.0。 – SolarLune

+0

此外,我的'預定大小值',在這個例子中,每個20。 – SolarLune

+0

但這是奇怪的 - for循環應該保持穩定的速度,不是嗎?隨着時間的推移,它肯定會越來越慢...... – SolarLune

1

三件事我能想到的:

內存 - 如果你存儲所有生成的值的地方,循環可能會下降,因爲所有的內存使用放緩。 Python有它自己的內存管理器,所以佔用大量內存最終可能會使程序變慢。

計算的複雜性 - Python使用任意精度的數字數據類型。如果你將很大的數字相乘(特別是浮點數),程序將會減速。這真的取決於這些值有多大。

立方體 - 它可能是Cube代碼中的一個錯誤(儘管我確信它可能就像它聽起來一樣簡單)。

相關問題