3

私はいくつかのpythonコードを最適化しようとしています(いくつかの行列演算を高速化するため)、私のコードはこれに似ています(私の実際のデータセットも「gps」に似ています)、

import numpy as np
gps = [np.random.rand(50,50) for i in xrange(1000)]
ips = np.zeros( (len(gps),len(gps)), dtype='float32')

for i in xrange(len(gps)):
  for j in xrange(0,i+1):
    ips[i,j]= f.innerProd(gps[i],gps[j])
    ips[j,i]= ips[i,j]
   print "Inner product matrix: %3.0f %% done (%d of %d)"%  \
               (((i+1)**2.)/(len(gps)**2.)*100, i, len(gps))

def innerProd(mat1,mat2):
    return float(np.sum(np.dot(np.dot(mat1,mat2),mat1)))

私が理解したいのは、プログラムが最初の反復中に高速で実行され始め、さらに反復するにつれて速度が低下するのはなぜですか? 質問が少し素朴かもしれませんが、他のことを試みる前に、何が起こっているのかをより明確に把握したいと思っています. 私はすでに Fortran で関数を実装し (Fortran 領域内に for ループを残します)、f2py を使用して動的ライブラリを作成し、Python から関数を呼び出しました。これは Python の新しいコードになります。

import numpy as np
import myfortranInnProd as fip

gps = [np.random.rand(50,50) for i in xrange(1000)]
ips = np.zeros( (len(gps),len(gps)), dtype='float32')

ips = fip.innerProd(gps)

残念ながら、(驚くべきことに) 私の fortran-python バージョンは最初のバージョンよりも 1.5​​ ~ 2 倍遅く実行されることがわかりました (Fortran 実装で MATMUL() を使用したことに言及することが重要です)。私はしばらくグーグルで調べてきましたが、この「スローダウン」は、大規模なデータセットを考えると、メモリ帯域幅、メモリ割り当て、またはキャッシュに関係していると思いますが、背後で実際に何が起こっているのか、どのように起こっているのかについてはよくわかりませんパフォーマンスを改善できますか。小さな intel atom 、2GB RAM、および 4 コア Intel xeon の両方でコードを実行しました。

なぜこの「減速」が起こるのかを理解する必要がありますか? 関数を C で実装すると、何か効果がありますか? またはGPUで実行するように実装しようとしますか? それを改善するための他のアイデアはありますか?前もって感謝します

4

2 に答える 2

4

当然のことながら、外側のループの実行が完了するたびに、内側のループの実行回数が増加します。が 0 の場合i、内側のループは 1 回だけ実行されますが、i100 の場合は 101 回実行されます。これはあなたの観察を説明できますか、それとも内部ループ自体の各実行が時間の経過とともに遅くなっていることを意味しますか?

于 2011-05-01T02:27:16.887 に答える
2

内側のループの実行回数は、外側のループのインデックスであるforの値によって異なります。内側のループが終了するたびにデバッグを表示しているため、大きくなるにつれて表示される頻度が少なくなります。(ただし、パーセンテージは定期的に増加することに注意してください。)ifori

于 2011-05-01T02:27:24.943 に答える