MATLABはNumpyの2倍の速さです 質問する

MATLABはNumpyの2倍の速さです 質問する

私は工学部の大学院生で、現在、数値シミュレーションのために 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

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

助言がありますか?

ベストアンサー1

この比較は、キャッシュのせいでまったく異なるものになります。連続したメモリ チャンクを転送したり、メモリ チャンクで作業したりする方が効率的だからです。この特定のベンチマークはメモリに縛られています。実際には計算は行われないため、キャッシュ ヒットのパーセンテージが優れたパフォーマンスを実現する鍵となります。

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

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

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

ガウスザイデルソルバーで何が起こっているのかよく分かりませんが、以前、私は次のような質問に対する回答を書きました。Numpy は MATLAB の半分の速度で動作しますMKL、FFT、Matlab の JIT について少し説明します。

おすすめ記事