MATLAB twice as fast as Numpy
我是一名工程学研究生,目前出于数值模拟的目的,正在从MATLAB过渡到Python。我的印象是,对于基本的数组操作,Numpy将与MATLAB一样快。但是,对于我编写的两个不同程序,MATLAB的运行速度似乎是Numpy的两倍。我用于Numpy(Python 3.3)的测试代码是:
1 2 3 4 5 6 7 8 9 10 11 | 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,我正在使用:
1 2 3 4 5 6 7 | a = rand(5000,5000,3); tic; a(:,:,1) = a(:,:,2); a(:,:,3) = a(:,:,1); a(:,:,2) = a(:,:,3); toc |
我使用的算法是在NASA网站上比较Numpy和MATLAB的算法。该网站显示,该算法的速度方面,Numpy超过了MATLAB。但是我的结果显示Numpy的仿真时间为0.49 s,MATLAB的仿真时间为0.29 s。我也在Numpy和Matlab上都运行了高斯-塞德尔求解器,并且得到了相似的结果(16.5 s和9.5 s)
我是Python的新手,在编程方面也不是非常识字。我使用的是WinPython 64位Python发行版,但也尝试使用Pythonxy无济于事。
我读过的应该提高性能的一件事是使用MKL构建Numpy。不幸的是,我不知道如何在Windows上执行此操作。我什至需要这样做吗?
有什么建议么?
由于缓存,这种比较最终变成了苹果到橘子,因为在连续的内存块上传输或执行某些工作效率更高。该特定基准是受内存限制的,因为实际上没有进行任何计算,因此缓存命中百分比是实现良好性能的关键。
Matlab以列优先顺序(Fortran顺序)放置数据,因此
Numpy默认为行优先顺序(C顺序),因此在
对于numpy-MKL和普通numpy来说,此结果应该非常相似,因为MKL是一种快速的LAPACK实现,并且在这里您不会调用任何使用它的函数(MKL在求解线性系统,计算点积时绝对有帮助...)。
我真的不知道Gauss Seidel求解器上发生了什么,但是前段时间我写了一个题为Numpy的问题的答案,该问题以MATLAB的一半速度运行,它谈到了MKL,FFT和Matlab的JIT。
您正在尝试重新创建NASA实验,但是您更改了许多变量。例如:
- 您的硬件和操作系统不同(www.nccs.nasa.gov/dali_front.html)
- 您的Python版本有所不同(2.5.3与3.3)
- 您的MATLAB版本有所不同(2008年与2012年)
假设NASA结果正确,则结果差异是由于这些变量中的一个或多个发生了变化。我推荐你:
- 使用SciPy预先构建的二进制文件重新测试。
- 研究是否相对于此类计算对MATLAB进行了任何改进。
另外,您可能会发现此链接有用。