2012-01-21 10 views
0

次のコードはテストコードですが、私の実際のコードは、私がむしろランダムに生成された元のマトリックスを使います。このネストされたforループをどのように最適化できますか?私はそれがpythonで可能であることを知っていますが、私はそうすることができません。複数の入れ子になったforループをPythonで最適化

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を掛けることができます。これにより、2つのループがなくなり、乗算が高速になるはずです。

あなたの実際のコードでも可能かどうかは分かりませんが、投稿したコードでは可能です。

関連する問題