我是一名工程专业的学生,目前正在从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上执行此操作。我甚至需要这样做吗?
有什么建议吗?
答案 0 :(得分:53)
由于缓存,这种比较最终会变成苹果到橙子,因为传输或在连续的内存块上做一些工作会更有效。这个特定的基准是内存限制的,因为实际上没有进行任何计算,因此缓存命中的百分比是实现良好性能的关键。
Matlab以列主顺序(Fortran顺序)放置数据,因此a(:,:,k)
是一个连续的内存块,可以快速复制。
Numpy默认为行主顺序(C顺序),因此在a[:,:,k]
中,元素之间存在大的跳跃,这会减慢内存传输速度。实际上,可以选择数据布局。在我的笔记本电脑中,创建具有a = np.asfortranarray(np.random.rand(5000,5000,3))
LED的阵列,速度提高5倍(1秒对0.19秒)。
这个结果对于numpy-MKL和普通numpy应该非常相似,因为MKL是一个快速的LAPACK实现,在这里你不会调用任何使用它的函数(MKL在解决线性系统,计算点积时肯定有帮助.. )。
我真的不知道Gauss Seidel求解器上发生了什么,但前段时间我写了一个题为Numpy running at half the speed of MATLAB的问题的答案,该问题讨论了MKL,FFT和Matlab的JIT。
答案 1 :(得分:3)