22

私は現在、数値シミュレーションの目的で MATLAB から Python に移行している工学部の大学院生です。基本的な配列操作では、Numpy は MATLAB と同じくらい高速であるという印象を受けました。ただし、私が書いた 2 つの異なるプログラムでは、MATLAB は Numpy の 2 倍弱の速さであることがわかります。Numpy (Python 3.3) に使用しているテスト コードは次のとおりです。

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

私が使用しているアルゴリズムは、Numpy と MATLAB を比較する NASA のWeb サイトで使用されているものです。この 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でこれを行う方法がわかりません。これを行う必要がありますか?

助言がありますか?

4

2 に答える 2

59

その比較は、キャッシングにより、最終的にはリンゴとオレンジになります。これは、メモリの連続したチャンクで転送または何らかの作業を行う方が効率的であるためです。実際には計算が行われないため、この特定のベンチマークはメモリ バウンドです。したがって、キャッシュ ヒットのパーセンテージが良好なパフォーマンスを達成するための鍵となります。

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

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

MKL は高速な LAPACK 実装であり、ここではそれを使用する関数を呼び出していないため、この結果は numpy-MKL と単純な numpy の両方で非常に似ているはずです (MKL は、線形システムを解き、内積を計算するときに間違いなく役立ちます...)。

ガウス ザイデル ソルバーで何が起こっているのかはよくわかりませんが、少し前に、Numpy running at half the speed of MATLABというタイトルの質問への回答を書き、 MKL、FFT、および Matlab の JIT について少し説明しました。

于 2013-07-09T23:03:37.127 に答える
3

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

  • ハードウェアとオペレーティング システムが異なります (www.nccs.nasa.gov/dali_front.html)
  • Python のバージョンが異なります (2.5.3 と 3.3)
  • MATLAB のバージョンが異なる (2008 対 2012)

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

  • SciPy ビルド済みバイナリで再テストします。
  • このタイプの計算に関連してMATLABに改善が加えられたかどうかを調査します。

また、このリンクが役立つ場合があります。

于 2013-07-09T22:51:42.070 に答える