NumPy的运行在MATLAB的速度的一半(Numpy running at half the sp

2019-08-31 23:18发布

我已经移植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速度工作?

Answer 1:

简单的例子

NumPy的是计算两个特征向量,特征值,因此将需要大约两倍长,这与您的放缓(使用一致np.linalg.eigvals仅计算特征值)。

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

为了得到几乎线性代数相同的速度,你可以对MKL或OpenBLAS构建NumPy的。 有一些商业计划书(也许免费为学者)从连续或Enthought 。 你也可以得到MKL和构建NumPy的自己 。

真实世界的例子

4倍速度较慢似乎有太多的(在与NumPy我已经重写了一些Matlab代码,并在一个非常类似的方式进行这两个程序)。 考虑到最近的Matlab的版本配备了一个简单的JIT,所以循环并不像通常的Python实现的那样糟糕。 如果你正在做许多FFT,你可以从使用中获益FFTW包装 ( pyFFTW似乎不错,但我没有用它)。



文章来源: Numpy running at half the speed of MATLAB