我是一名工程研究生,目前正在从 MATLAB 过渡到 Python,以进行数值模拟。我的印象是,对于基本的数组操作,Numpy 会和 MATLAB 一样快。但是,对于我编写的两个不同的程序,MATLAB 的速度似乎比 Numpy 快两倍。我用于 Numpy (Python 3.3) 的测试代码是:
import numpy as np
import time
a = np.random.rand(5000,5000,3)
tic = time.time()
a[:,:,0] = a[:,:,1]
a[:,:,2] = a[:,:,0]
a[:,:,1] = a[:,:,2]
toc = time.time() - tic
print(toc)
而对于 MATLAB 2012a,我正在使用:
a = rand(5000,5000,3);
tic;
a(:,:,1) = a(:,:,2);
a(:,:,3) = a(:,:,1);
a(:,:,2) = a(:,:,3);
toc
我使用的算法是在 NASA website 上使用的算法。比较 Numpy 和 MATLAB。该网站显示 Numpy 在该算法的速度方面超过了 MATLAB。然而,我的结果显示 Numpy 的仿真时间为 0.49 秒,MATLAB 的仿真时间为 0.29 秒。我还在 Numpy 和 Matlab 上运行了 Gauss-Seidel 求解器,我得到了类似的结果(16.5 s vs. 9.5 s)
我是 Python 的新手,在编程方面并不是非常有文化。我正在使用 WinPython 64 位 Python 发行版,但也尝试过 Pythonxy 无济于事。
我读过的应该提高性能的一件事是使用 MKL 构建 Numpy。不幸的是,我不知道如何在 Windows 上执行此操作。我什至需要这样做吗?
有什么建议吗?
最佳答案
由于缓存,这种比较最终是苹果对橙子,因为在连续的内存块上传输或做一些工作效率更高。这个特定的基准测试是受内存限制的,因为实际上没有进行任何计算,因此缓存命中的百分比是实现良好性能的关键。
Matlab 以列优先顺序(Fortran 顺序)放置数据,因此 a(:,:,k)
是一 block 连续的内存,可以快速复制。
Numpy 默认为行优先顺序(C 顺序),因此在 a[:,:,k]
中元素之间存在较大的跳跃,这会减慢内存传输。实际上,可以选择数据布局。在我的笔记本电脑中,使用 a = np.asfortranarray(np.random.rand(5000,5000,3))
创建数组可以将速度提高 5 倍(1 秒对 0.19 秒)。
对于 numpy-MKL 和普通 numpy,这个结果应该非常相似,因为 MKL 是一个快速的 LAPACK 实现,在这里你没有调用任何使用它的函数(MKL 在求解线性系统、计算点积时绝对有帮助.. .).
我真的不知道 Gauss Seidel 求解器发生了什么,但前段时间我写了一个标题为 Numpy running at half the speed of MATLAB 的问题的答案。稍微讲了一点 MKL、FFT 和 Matlab 的 JIT。
关于python - MATLAB 的速度是 Numpy 的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559140/