3

MATLABとNumPyでEIG関数をプロファイリングして、Macbook Pro(2 GHz、OS X 10.6を実行するクアッドコアi7)のパフォーマンスを比較してみました。NumPy EIGは、MATLABと比較して非常に遅いようです。

これが私がNumPyでプロファイリングしたコードです:

s = '''\
x = numpy.random.random((2000,2000));
numpy.linalg.eig(x);
'''
t = timeit.Timer(stmt=s,setup="import numpy")
result = t.repeat(repeat=5,number=10)
result
Out[22]: 
[197.1737039089203,
 197.34872913360596,
 196.8160741329193,
 197.94081807136536,
 194.5740351676941]

これは、NumPyでは約19.5秒/実行です。

これがMATLABの同じコードです:

clear all
tic;
for i = 1:50
    x = rand(2000,2000);
    eig(x);
end
toc;
Elapsed time is 267.976645 seconds.

これは、MATLABでは約5.36秒/execです。

これはJITのパフォーマンスにあまり依存しないはずなので、おそらくBLASとBLASライブラリにアクセスするルーチンに要約されます。私はMATLABがMacでAccelerateFrameworkを使用していることを知っています。

NumPyは私のMacbookProでAccelerateFrameworkBLASも使用しているようです。これがの出力ですnumpy.show_config()

numpy.show_config()
lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]

Python2.7.2とNumPy1.6(どちらもMacPortsからインストール)を使用しています

それで、NumPyの人々への私の質問はここにあります:なぜこの場合NumPyは遅いのですか?NumPyのインストール中にいくつかの最適化を省略しましたか?

4

3 に答える 3

5

私の知る限り、MATLABはAccelerate Frameworkではなく、MKLライブラリをBLASとして使用しています。私の経験によると、AccelerateはMKLよりも大幅に遅いです。これを確認するには、NumpyがMKLに対してコンパイルされているEnthought Python Distribution(EPD)のアカデミックバージョンを入手して、これらのタイミングを比較してみてください。さらに、デフォルトでは、MATLABはすべてのスレッドを使用します(シングルスレッドモードで実行してみてください)が、Numpyは使用しません。EPDでは、実行することで実行できます

import mkl 
mkl.set_num_threads(4) 
于 2012-04-01T17:16:27.230 に答える
2

私がその権利を読んでいるなら、あなたはeig関数に加えて乱数ジェネレーターのパフォーマンスをプロファイリングしています。GAUSSとMATLABを比較して、1年に一度、その間違いを犯しました。乱数の生成を因数分解して、何が得られるかを確認します。

もう1つの注意点-LAPACK/BLASのものの中には、numpy配列がFortranの順序で内部的に格納されていることを確認すると、パフォーマンスを向上させることができます。

In [12]: x = numpy.random.random((200,200))

In [13]: x.flags
Out[13]: 
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False


In [15]: x = numpy.array(x, order="F")

In [16]: x.flags
Out[16]: 
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

-クリス

于 2012-04-02T03:48:08.450 に答える
1

大きな違いは、MATLABでは固有値のみを計算しているのに対し、python/numpyでは固有値と固有ベクトルの両方を計算しているためです。これを修正して適切な比較を行うには、次のいずれかを実行する必要があります。1. numpy.linalg.eig(x)をnumpy.linalg.eigvals(x)に変更し、matlabコードをそのままにするか2. eig(x )to [V、D] = eig(x)in matlab、python / numpyコードをそのままにします(これにより、matlabスクリプトによって消費されるメモリが増える可能性があります)。python/ numpyはMKLで最適化されています(私はウィンドウを使用します。 acclerateフレームワークについてはよくわかりません)MKLで最適化されたmatlabと同じか、わずかに高速です。

于 2012-05-29T17:01:24.143 に答える