2013-07-09 18 views
19

私は現在、数値シミュレーションの目的でMATLABからPythonに移行している工学の大学院生です。私は、基本的な配列操作のために、NumpyはMATLABほど高速であるという印象を受けました。しかし、MATLABはNumpyの2倍の速さです。私はnumpyのために使用していたテストコード(パイソン3.3)である:Numpyの2倍のMATLAB

import numpy as np 
import time 

a = np.random.rand(5000,5000,3) 

tic = time.time() 
a[:,:,0] = a[:,:,1] 
a[:,:,2] = a[:,:,0] 
a[:,:,1] = a[:,:,2] 
toc = time.time() - tic 
print(toc) 

MATLABの2012Aのために私が使用しているのに対し:

a = rand(5000,5000,3); 

tic; 
a(:,:,1) = a(:,:,2); 
a(:,:,3) = a(:,:,1); 
a(:,:,2) = a(:,:,3); 
toc 

私が使用しているアルゴリズムは、比較NASA websiteに使用されるものですナンシーとMATLABこのWebサイトは、Numpyがこのアルゴリズムの速度に関してMATLABを上回っていることを示しています。しかし、私の結果は、Numpyのシミュレーション時間は0.49秒、MATLABのシミュレーション時間は0.29秒です。私はNumpyとMatlabの両方でGauss-Seidelソルバを実行しましたが、同様の結果が得られます(16.5秒対9.5秒)

私はPythonにはまったく新しく、プログラミング面ではあまり学んでいません。 WinPython 64ビットPythonディストリビューションを使用していますが、Pythonxyを無駄にしようとしました。

パフォーマンスを向上させるために私が読んだことの1つは、MKLを使用してNumpyを構築することです。残念ながら、私はWindows上でこれを行う方法がわかりません。私もこれをする必要がありますか?

提案がありますか?

+0

クリストフゴールケnumpyのは、インテルMKLにリンクされて、多くのPythonパッケージ用のコンパイル済みのWindowsバイナリを提供します。http://www.lfd.uci.edu/~gohlke/pythonlibs/ – Amro

+0

うん。 PythonはMatlabに比べてさらに遅くて、あなたは運が良かったです。 :-) – horchler

+2

WinPythonの現在のディストリビューション(既にNumPy-MKLが付属しています)(https://code.google.com/p/winpython/wiki/PackageIndex_33)。 – Jaime

答えて

51

この比較では、連続したメモリチャンクに対して転送や作業を行う方が効率的であるため、キャッシングのためにリンゴがリンゴであることになります。この特定のベンチマークは、実際には計算が行われないため、メモリ・バウンドであるため、良好なパフォーマンスを達成するためにはキャッシュ・ヒット率が重要です。

Matlabは列優先順位(Fortran順)でデータを配置するため、a(:,:,k)は連続したメモリチャンクであり、コピーが高速です。

Numpyのデフォルトは行優先(C順序)なので、a[:,:,k]では要素間に大きなジャンプがあり、メモリ転送が遅くなります。実際には、データのレイアウトを選択することができます。私のラップトップでは、a = np.asfortranarray(np.random.rand(5000,5000,3))でアレイを作成すると、5倍のスピードアップ(1秒対0.19秒)が実現しました。

この結果は、numpy-MKLとプレーンnumpyの両方で非常によく似ているはずです。なぜなら、MKLは高速LAPACKの実装であり、これを使用する関数を呼び出さないからです(MKLは、 ..)。

Gauss Seidelソルバーで何が起こっているのか分かりませんが、以前はMKL、FFT、MatlabのJITについて少し話しているNumpy running at half the speed of MATLABという質問に答えました。

+0

私はこれがdownvoted気づいた(それは私のための最初の)。どのように答えを改善するための任意のコメント? – jorgeca

+0

私はあなたの提案をさまざまなアレイ構成で試してみました。また、Numpyのスピードアップは〜5倍になりました。私はGauss-Seidelソルバでこの提案を試みましたが、別の問題があることを示唆する改善はありませんでした。私はこのソルバーで何か派手な関数や何も使用していない、それはベクトル化された代入の約16行といくつかの制御ステートメントでほんの少しのループです。あなたが古い話題に書いたことも私を助けません。私が検査するコードをあなたに送ったり、新しい質問でそれを尋ねたりする方法はありますか? – nicholls

+0

問題は異なっているように見えるので、もっと多くの人が恩恵を受けられるように別の質問をすることもできます。 – jorgeca

3

NASA実験を再現しようとしていますが、多くの変数が変更されています。

  • ハードウェアおよびオペレーティング・システムは(www.nccs.nasa.gov/dali_front.html)
  • あなたのPythonのバージョンが異なっている(2.5.3対3.3)異なる
  • あなたMATLABバージョン:例えば(2008年対2012年)

NASAの結果が正しいと仮定すると、結果の違いはこれらの変更された変数の1つ以上に起因します。私はあなたをお勧めします:

  • 事前にSciPy binariesで再テストします。
  • の改善がこのタイプの計算に対して行われたかどうかを調べる。

また、this linkが便利です。

+0

私は最初、NASAの研究と比較しようとしましたが、私は何かできることがあるかどうか、あるいはナンシーが2倍遅くなる可能性があるかどうかを調べることをほとんど求めていました。その答えが私が使用していたMATLABのバージョンがちょうど速かったなら、それは私が必要とするものでした。しかし、ありがとう。 – nicholls

関連する問題