web-dev-qa-db-ja.com

MATLABはPythonよりも高速ですか?

Biot–Savartの法則 を使用していくつかの導体の磁場を計算し、1000x1000x1000のマトリックスを使用したい。 MATLABを使用する前に、Pythonを使用するようになりました。 Python MATLABよりも遅いですか?どうすればPythonより速くできますか?

編集:おそらく最良の方法は、C/C++で大きな配列を計算し、それをPythonに転送することです。それから VPython で視覚化したい。

EDIT2:私の場合、どちらが良いですか:CまたはC++?

36
kame

このリンクの下部にいくつかの有用な結果があります

http://wiki.scipy.org/PerformancePython

導入部から、

Laplaceの方程式を解くためのNumPy、Pyrex、Psyco、Fortran(77および90)およびC++との織りの比較。

また、MATLABを比較し、Python and NumPy を使用した場合と同様の速度を示すようです。

もちろん、これは特定の例にすぎず、アプリケーションによってパフォーマンスが向上または低下する可能性があります。両方で同じテストを実行して比較しても問題はありません。

[〜#〜] atlas [〜#〜] などの最適化されたライブラリを使用してNumPyをコンパイルし、いくつかの [〜#〜] blas [〜#〜] / [〜#〜] lapack [〜#〜] ルーチン。これらは、MATLABと同等の速度でなければなりません。

NumPyのダウンロードが既にビルドされているかどうかはわかりませんが、NumPyをコンパイルすると、ATLASがライブラリをシステムに合わせて調整すると思います。

http://www.scipy.org/Installing_SciPy/Windows

このリンクには、Windowsプラットフォームで必要なものに関する詳細が記載されています。

編集:

CまたはC++のどちらがパフォーマンスが良いかを知りたい場合は、新しい質問をする価値があります。上記のリンクからC++が最高のパフォーマンスを発揮しますが。他のソリューション、つまりPyrex、Python/Fortran(f2pyを使用)、およびインラインC++も非常に近いものです。

私がこれまでに行ったC++での唯一の行列代数は、 [〜#〜] mtl [〜#〜] を使用し、拡張カルマンフィルターを実装することでした。ただし、本質的には、LAPACK/BLASを使用しているライブラリと、最適化の程度によって異なります。

このリンクには、多くの言語のオブジェクト指向数値パッケージのリストがあります。

http://www.oonumerics.org/oon/

27
petantik

NumPy およびMATLABは両方とも、基礎となる [〜#〜] blas [〜#〜] を使用して、標準線形代数演算を実装します。しばらくの間は両方とも [〜#〜] atlas [〜#〜] を使用していましたが、最近では、MATLABにはIntelのような他の実装も含まれているようです Math Kernel Library (MKL)。どちらが速いかは、システムとBLAS実装のコンパイル方法によって異なります。 NumPyをMKLでコンパイルすることもできます。 Enthought は、Pythonディストリビューション( roadmap を参照)のMKLサポートに取り組んでいます。最近の 興味深いブログ記事 これについて。

一方、より特殊な操作またはデータ構造が必要な場合は、PythonとMATLABは最適化のためのさまざまな方法を提供します( CythonPyCUDA 、...)。

編集:さまざまなBLAS実装を考慮して、この回答を修正しました。これが現在の状況を公平に表してくれることを願っています。

19
nikow

有効なテストはベンチマークのみです。それは、プラットフォームが何であるか、およびBiot-Savart LawがMatlabまたはNumPy/SciPyの組み込み操作にどの程度うまくマッピングされるかに大きく依存します。

Pythonの高速化については、GoogleはPython用のJITコンパイラであるUnladen Swallowに取り組んでいます。おそらくこのようなプロジェクトは他にもあります。

7
Mike DeSimone

編集2に従って、使用可能な線形代数サブルーチン(LapackおよびBlas)を活用でき、行列計算でC/C++よりもはるかに単純であるため、Fortranを使用することを強くお勧めします。

C/C++アプローチを使用する場合は、おそらく単純なインターフェイスで生のパフォーマンスが必要になるため、Cを使用します(マトリックス計算は、単純なインターフェイスと複雑なアルゴリズムを持つ傾向があります)。

ただし、C++を使用する場合は、TNT(テンプレート数値ツールキット、LapackのC++実装)を使用できます。

幸運を。

4
Escualo

Python(NumPyを使用))を使用している場合、使用する部分、最適化された線形代数ライブラリがインストールされているかどうか、およびどのようによく知っているかによって、遅くなる場合がありますNumPyを利用します。

より速くするために、できることがいくつかあります。 Cython というツールがあります。これにより、タイプ宣言をPythonコードに追加し、それをPython C.これがどれだけの利益を得るかは、型宣言にどれだけ熱心に取り組んでいるかに少し依存します-何も追加しなければ、多くの利点はありません。CythonはNumPy型もサポートしていますがこれらは他のタイプよりも少し複雑です。

優れたグラフィックカードがあり、GPUコンピューティングについて少し学習したい場合は、 PyCUDA も役立ちます。 (nvidiaグラフィックカードがない場合は、PyOpenCLも動作していると聞いています)。私はあなたの問題ドメインを知りませんが、それがCUDA問題にマッピングできるなら、10 ^ 9要素をうまく処理できるはずです。

3
kwatford

そして、MATLABと NumPy / [〜#〜] mkl [〜#〜] との間の更新された「比較」は、いくつかの線形代数関数に基づいています。

http://dpinte.wordpress.com/2010/03/16/numpymkl-vs-matlab-performance/

ドット積はそれほど遅くありません;-)

2
user294958

また、Python(+ NumPy)はF2Pyモジュールを介してFortranと簡単にインターフェイスできます。これにより、基本的に、FortranにオフロードするコードのネイティブなFortranの速度が向上します。

0
Connor Glosser

この同じ質問に答えるのに難しい数字を見つけることができなかったので、先に進み、自分でテストを行いました。使用した結果、スクリプト、およびデータセットはすべて MATLAB vs Python振動解析の速度

要するに、MATLABのFFT関数はPythonよりも優れていますが、同等の結果と速度を得るために簡単な操作を行うことができます。データのインポートはfasterin Python MATLABと比較(scipy.ioを使用するMATファイルでも)).

0
Steve