gpt4 book ai didi

python - Numpy 的运行速度是 MATLAB 的一半

转载 作者:太空狗 更新时间:2023-10-29 17:47:46 24 4
gpt4 key购买 nike

我一直在将 MATLAB 代码移植到 Python,经过相当多的工作后,我得到了一些有用的东西。然而,缺点是 Python 运行我的代码的速度比 MATLAB 慢。我知道使用优化的 ATLAS 库会加快速度,但实际上实现它让我感到困惑。这是正在发生的事情:

我在没有安装 BLAS 的情况下启动了一个 ipython session :

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 的速度运行?

最佳答案

简单例子

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

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

要在线性代数中获得几乎相同的速度,您可以针对 MKL 或 OpenBLAS 构建 Numpy。 Continuum 有一些商业优惠(可能对学术界免费)或 Enthought .您还可以获得 MKL 并构建 Numpy yourself .

现实世界的例子

慢 4 倍似乎太多了(我用 Numpy 重写了一些 Matlab 代码,两个程序的执行方式非常相似)。考虑到最近的 Matlab 版本带有简单的 JIT,因此循环不像通常的 Python 实现那样糟糕。如果您要进行多次 FFT,使用 FFTW wrapper 可能会有所帮助(pyFFTW 看起来不错,但我没用过)。

关于python - Numpy 的运行速度是 MATLAB 的一半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com