关于python:MATLAB的速度是Numpy的两倍

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顺序)放置数据,因此a(:,:,k)是连续的内存块,可以快速复制。

Numpy默认为行优先顺序(C顺序),因此在a[:,:,k]中,元素之间存在较大的跳转,这减慢了内存传输的速度。实际上,可以选择数据布局。在我的笔记本电脑中,使用a = np.asfortranarray(np.random.rand(5000,5000,3))创建阵列可将速度提高5倍(1 s对0.19 s)。

对于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进行了任何改进。

另外,您可能会发现此链接有用。