我一直在将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中,相同的代码运行速度快两倍
tic,eig(randn(1E2));toc*1000
6.5650
我从Ubuntu存储库安装了未优化的ATAS deb。重新启动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的速度仍然是原来的两倍。在一个真实的例子中,我在傅立叶域中进行图像配准,Matlab的等效配准比Python版本快4到5倍。有没有人能让Numpy以MATLAB的速度工作?
发布于 2013-04-23 20:48:02
简单的例子
Numpy同时计算特征向量和特征值,因此它将花费大约两倍的时间,这与您的速度减慢一致(使用np.linalg.eigvals
仅计算特征值)。
最后,np.linalg.eig
是dgeev的一个小包装器,很可能同样的事情也会发生在使用MKL的Matlab中。
为了在线性代数中获得几乎相同的速度,您可以针对MKL或OpenBLAS构建Numpy。Continuum或Enthought提供了一些商业服务(可能对学者是免费的)。您还可以获得MKL并构建Numpy yourself。
真实世界的例子
4倍的速度似乎太慢了(我用Numpy重写了一些Matlab代码,两个程序的执行方式非常相似)。考虑到最近的Matlab版本提供了一个简单的JIT,所以循环并不像通常的Python实现那样糟糕。如果你正在做很多快速傅立叶变换,你可以从使用FFTW wrapper (pyFFTW看起来不错,但我还没有用过它)中受益。
https://stackoverflow.com/questions/16178471
复制