13

私は MATLAB コードを Python に移植してきましたが、かなり多くの作業を行った結果、動作するものを手に入れました。ただし、欠点は、Python が私のコードを実行する速度が MATLAB よりも遅いことです。最適化された ATLAS ライブラリを使用すると速度が向上することは理解していますが、実際にこれを実装すると混乱します。何が起こっているかは次のとおりです。

BLAS がインストールされていない状態で ipython セッションを開始します。

import numpy.distutils.system_info as sysinfo
import time
In [11]: sysinfo.get_info('atlas')
Out[11]: {}

timeit( eig(randn(1E2,1E2)) )
100 loops, best of 3: 13.4 ms per loop

Matlab の同じコードは 2 倍の速度で実行されます

tic,eig(randn(1E2));toc*1000
    6.5650   

最適化されていない ATAS deb を Ubuntu リポジトリからインストールします。ipython を再起動すると、次のようになります。

In [2]: sysinfo.get_info('atlas')
 ...
Out[2]: 
{'define_macros': [('ATLAS_INFO', '"\\"3.8.4\\""')],
 'include_dirs': ['/usr/include/atlas'],
 'language': 'f77',
 'libraries': ['lapack', 'f77blas', 'cblas', 'atlas'],
 'library_dirs': ['/usr/lib/atlas-base/atlas', '/usr/lib/atlas-base']}

そしてテストコード:

In [4]: timeit( eig(randn(1E2,1E2)) )
100 loops, best of 3: 16.8 ms per loop

だから速くはありません。どちらかといえば、少し遅いです。しかし、私はまだ最適化された BLAS に切り替えていません。私は次の指示に従います: http://danielnouri.org/notes/category/python/ライブラリを構築し、最適化されていないバージョンをこれらで上書きします。ipython を再起動しましたが、変化はありません。

In [4]: timeit( eig(randn(1E2,1E2)) )
100 loops, best of 3: 15.3 ms per loop

これ以上良くなることはありませんか?この単純な例では、MATLAB は依然として 2 倍高速です。フーリエ ドメインでイメージ レジストレーションを行っている実際の例では、Matlab の同等物は Python バージョンよりも 4 ~ 5 倍高速です。Numpy を MATLAB の速度で動作させることができた人はいますか?

4

1 に答える 1

12

簡単な例

Numpy は固有ベクトルと固有値の両方を計算しているため、約 2 倍の時間がかかります。これは、速度低下と一致しています (np.linalg.eigvals固有値のみを計算するために使用します)。

最終的にnp.linalg.eigは dgeev の小さなラッパーであり、MKL を使用している Matlab でも同じことが起こる可能性があります。

線形代数で実質的に同じ速度を得るには、MKL または OpenBLAS に対して Numpy を構築できます。ContinuumまたはEnthoughtからいくつかの商用オファー (おそらく学者には無料) があります。MKL を入手して Numpy を自分でビルドすることもできます。

実際の例

4倍遅いのは多すぎるようです(NumpyでいくつかのMatlabコードを書き直しましたが、両方のプログラムが非常に似た方法で実行されました)。最近の Matlab バージョンには単純な JIT が付属しているため、ループは通常の Python 実装ほど悪くないことを考慮してください。多くの FFT を実行している場合は、FFTW ラッパーを使用することでメリットが得られます( pyFFTWは良さそうですが、私は使用していません)。

于 2013-04-23T20:48:01.927 に答える