Numpy以MATLAB的一半速度运行

时间:2013-04-23 20:21:29

标签: python performance matlab numpy atlas

我一直在将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的速度工作?

1 个答案:

答案 0 :(得分:11)

简单示例

Numpy正在计算特征向量和特征值,因此它将花费大约两倍的时间,这与您的减速一致(使用np.linalg.eigvals仅计算特征值)。

最后,np.linalg.eig是围绕dgeev的一个小包装器,可能在使用MKL的Matlab中也会发生同样的事情。

要在线性代数中获得几乎相同的速度,您可以针对MKL或OpenBLAS构建Numpy。 ContinuumEnthought有一些商业报价(可能免费提供给学者)。你也可以获得MKL并建立Numpy yourself

真实世界的例子

4倍慢似乎太多了(我在Numpy中重写了一些Matlab代码,两个程序以非常类似的方式执行)。考虑到最近的Matlab版本带有一个简单的JIT,因此循环不像通常的Python实现那么糟糕。如果你正在做很多FFT,你可以使用FFTW wrapperpyFFTW似乎很好,但我还没有用过它)。