14

Python 2.6.5 を使用して、大きな行列 (約 1000x1000) の固有値を計算したいと思います。急にできなくなりました。この質問に対処する他のスレッドは見つかりませんでした。

私が走るとき

a = rand(1000,1000);
tic;
for i =1:10
    eig(a);
end
toc;

MATLAB では約 30 秒かかります。Python での同様のテストには 216 秒かかります。RPy を使用して R で実行しても、計算はそれほど高速化されませんでした。Octave でのテストには 93 秒かかりました。速度の違いに少し戸惑います。

私がオンラインで見つけることができるこのような質問の唯一の例は、数年前のthisです。その質問のポスターは、異なる Python ディレクトリ構造を持っているため (間違っている可能性もありますが、これは投稿の年代によるものだと思います)、特派員が投稿した指示に従おうとするほど自信がありませんでした。

パッケージ マネージャーによると、LAPACK がインストールされており、Python の計算に NumPy と SciPy を使用しています。

from numpy import *
from scipy import *
from numpy.linalg import *
import time

a = randn(1000,1000)
tic = time.clock()
for i in range(0,10):
    eig(a)
toc = time.clock()
print "Elapsed time is ", toc-tic

私はPythonにかなり慣れていないので、ばかげたことをしたかもしれません。さらに情報を提供する必要がある場合はお知らせください。

4

2 に答える 2

15

あなたが見ているのは、Matlab で使用されている Intel Math Kernel Library (MKL) と、scipy がリンクされているシステム上の LAPACK 実装 (ATLAS かな?) との違いだと思います。これらのベンチマークで、MKL がどれだけ高速かを確認できます。

インテル® MKL ライブラリーに対して Scipy を再構築できれば、はるかに優れたパフォーマンスが得られると思います。Windows を使用している場合は、ビルド済みのコピーをここからダウンロードできます。または、Enthought Python Distribution などの使用を検討することもできます。

于 2011-05-18T23:33:05.090 に答える
3

タイミングの違いはありますが、あなたほど劇的ではありません。私のMATLAB(R2010b) タイミングは ~25 秒で、python(2.7) タイミングは ~60 秒でした。

MATLAB数値および行列操作言語のみであるため、これらの数値にはあまり驚かず、汎用言語であるよりもJITアクセラレータの利点があります。一般に、とpythonの違いは非常に小さいですが、あなたの場合のように行列のサイズが大きい場合に明らかになります。MATLABpython+numpy

これは、Python のパフォーマンスを改善する方法がないという意味ではありません。scipyのWeb サイトにあるPerformancePythonの記事では、Python のパフォーマンスを向上させるさまざまな方法を紹介しています。

于 2011-05-18T22:53:01.247 に答える