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 中相同的代码运行速度是原来的两倍

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 的速度工作?

4

1 回答 1

12

简单的例子

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

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

要在线性代数中获得几乎相同的速度,您可以针对 MKL 或 OpenBLAS 构建 Numpy。ContinuumEnthought提供了一些商业优惠(可能对学者免费)。您也可以获取 MKL 并自己构建 Numpy 。

真实世界的例子

慢 4 倍似乎太多了(我已经在 Numpy 中重写了一些 Matlab 代码,并且两个程序都以非常相似的方式执行)。考虑到最近的 Matlab 版本带有一个简单的 JIT,因此循环并不像通常的 Python 实现那么糟糕。如果你正在做很多 FFT,你可以从使用FFTW 包装器中受益(pyFFTW看起来不错,但我没有使用它)。

于 2013-04-23T20:48:01.927 回答