私はいくつかの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で実行するように実装しようとしますか? それを改善するための他のアイデアはありますか?前もって感謝します