MATLAB的速度是Numpy的两倍

时间:2013-07-09 22:07:34

标签: python performance matlab numpy intel-mkl

我是一名工程专业的学生,​​目前正在从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上执行此操作。我甚至需要这样做吗?

有什么建议吗?

2 个答案:

答案 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)

您正在尝试重新创建NASA实验,但是您已经更改了许多变量。例如:

  • 您的硬件和操作系统不同(www.nccs.nasa.gov/dali_front.html)
  • 您的Python版本不同(2.5.3 vs 3.3)
  • 您的MATLAB版本不同(2008年与2012年)

假设NASA结果是正确的,结果的差异是由于这些变化的变量中的一个或多个。我建议你:

  • 使用SciPy预建binaries重新测试。
  • 研究相对于此类计算是否对MATLAB进行了任何改进。

此外,您可能会发现this link有用。