2012-01-21 59 views
0

以下是測試代碼,我的實際代碼看起來幾乎相似,其中我使用原始矩陣而非隨機生成。我怎樣才能優化這個嵌套for循環。我知道這是可能的python,但我無法這樣做。在Python中優化多重嵌套for循環

import time 
import numpy as np 

a = 1000 
b = 500 
sum2,sum3,sum4 = 0 
t0 = time.time() 

x = np.random.random(a*a).reshape([a,a]) 

for outer1 in xrange(0,a): 
    for inner1 in xrange(0,b): 
     for outer2 in xrange(0,a): 
      for inner2 in xrange(0, a): 
       sum2 += x[outer2][inner2] #this is not the only operation I have 
     for outer3 in xrange(0,a): 
      for inner3 in xrange(0, a): 
       sum3 += x[outer3][inner3] #this is not the only operation I have 
     for outer4 in xrange(0,a): 
      for inner4 in xrange(0, a): 
       sum4 += x[outer4][inner4] #this is not the only operation I have 

print time.time() - t0 
print 'sum2: '+str(sum2)+' sum3: '+str(sum3)+' sum4: '+str(sum4) 

我正在使用python 2.7。 謝謝。

+0

您所做的額外計算使您可以優化代碼的方式發生重大變化。而且,更可能是造成瓶頸的原因,而不是這些總和。 – Dunes

回答

2

使用Numpy數組,優化計算的方法是儘可能使用矢量化操作。在你的榜樣,因爲它看起來像你總結每個數組中的元素,你應該保持陣列1維和只是直接使用sum功能:

x = np.random.random(a*a) 
sum2 = x.sum() 

等。

同樣,對於您的實際代碼,您需要將您的循環轉換爲矢量化操作。如果不知道您的實際計算是什麼,我無法說出如何做到這一點。

1

當你的代碼表明,sum2只值outer2inner2依賴,而這兩個循環,其變量是outer1inner1內完成。在粘貼的代碼中,可以省略2個外部循環(outer1inner1),而是將sum2的值乘以a*b。這消除了兩個循環,並通過應該更快的乘法來代替它們。

我不知道這是否可能與您的實際代碼,但在您發佈的代碼中,它應該是可能的。