4

4-D numpy tensor の辞書を初期化する際のパフォーマンスの問題があります。

係数名のリストがあります:

cnames = ['CN', 'CM', 'CA', 'CY', 'CLN' ...];

これは固定サイズではありません (上位コードに依存します)。係数ごとに、ゼロの 4-D テンソル [nalpha X nmach X nbeta X nalt] を生成する必要があるため (事前割り当ての目的で)、次のようにします。

#Number of coefficients
numofc = len(cnames);

final_data = {};
#I have to generate <numofc> 4D matrixes
for i in range(numofc):
    final_data[cnames[i]]=n.zeros((nalpha,nmach,nbeta,nalt));

各インデックスは 10 ~ 30の整数です。 各インデックスは 100 ~ 200 の整数です。

これには4分ほどかかります。どうすればこれをスピードアップできますか? それとも私は何か間違ったことをしていますか?

4

1 に答える 1

6

投稿したコードの実行に 4 分もかからないはずです (コードcnamesが極端に大きいか、RAM が非常に少なく、スワップ領域を使用する必要がある場合を除きます)。

import numpy as np

cnames = ['CN', 'CM', 'CA', 'CY', 'CLN']*1000
nalpha,nmach,nbeta,nalt = 10,20,30,40
#Number of coefficients
numofc = len(cnames)

final_data = {}
#I have to generate <numofc> 4D matrixes
for i in range(numofc):
    final_data[cnames[i]]=np.zeros((nalpha,nmach,nbeta,nalt))

5000 個の要素がある場合cnamesでも、数秒程度しかかかりません。

% time test.py
real    0m4.559s
user    0m0.856s
sys 0m3.328s

ステートメントの最後のセミコロンは、他の言語の経験があることを示しています。その言語のコマンドを 1 行ずつ NumPy/Python に変換する場合は注意してください。C で行うように NumPy でコーディングすると、速度が低下します。

特に、配列内の要素を要素ごとに更新することは避けてください。これは C では問題なく動作しますが、Python では非常に遅くなります。NumPy は、Fortran、Cython、C、または C++ でコード化された関数に委譲することで速度を達成します。配列を要素ごとに更新することで、それほど高速ではない Python ループを使用しています。

代わりに、配列全体 (または少なくとも配列のスライス) に対する操作の観点から、計算を言い換えてみてください。

おそらく、問題の原因について推測しすぎたのでしょう。あなたのコードをプロファイリングする必要があります。さらに具体的なヘルプが必要な場合は、プロファイルの結果と問題のあるコードを投稿してください ( SSCCEの形式で最も役立ちます)。

于 2013-04-20T13:52:42.250 に答える