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のインストール中にいくつかの最適化を省略しましたか?