MATLAB比Numpy快两倍。

22

我是一名工程研究生,目前正在从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 网站上用于比较Numpy和MATLAB的算法。该网站显示,对于此算法,Numpy在速度方面超过了MATLAB。然而,我的结果显示Numpy的模拟时间为0.49秒,MATLAB的模拟时间为0.29秒。我还在Numpy和Matlab上运行了高斯-赛德尔求解器,并获得了类似的结果(16.5秒对9.5秒)。
我是Python的新手,对编程不是非常精通。我正在使用WinPython 64位Python发行版,但也尝试了Pythonxy,但没有成功。
我读到的一个应该提高性能的方法是使用MKL构建Numpy。不幸的是,我不知道如何在Windows上做到这一点。我需要这样做吗?
有什么建议吗?

Christoph Gohlke为许多Python软件包提供预编译的Windows二进制文件,其中NumPy链接到Intel MKL:http://www.lfd.uci.edu/~gohlke/pythonlibs/ - Amro
没错。Python以前相对于Matlab来说速度更慢,所以你很幸运。 :-) - horchler
2
当前的WinPython发行版已经附带了NumPy-MKL - Jaime
2个回答

59
该比较由于缓存而变得不可比,因为在连续的内存块上传输或执行某些工作更有效率。这个特定的基准测试是内存限制的,因为实际上没有进行任何计算,因此缓存命中率的百分比对于实现良好的性能至关重要。
Matlab按列主序(Fortran顺序)放置数据,因此a(:,:,k)是一个连续的内存块,可以快速复制。
Numpy默认使用行主序(C顺序),因此在a[:,:,k]中元素之间存在大跳跃,这会减慢内存传输速度。实际上,可以选择数据布局。在我的笔记本电脑上,使用a = np.asfortranarray(np.random.rand(5000,5000,3))创建数组可以提高5倍速度(1秒 vs 0.19秒)。
这个结果对于numpy-MKL和纯numpy应该非常相似,因为MKL是一个快速的LAPACK实现,在这里你没有调用任何使用它的函数(MKL在解决线性系统、计算点积等方面确实有帮助)。

我不太了解Gauss Seidel求解器的情况,但是一段时间以前我写了一个回答问题Numpy running at half the speed of MATLAB,其中谈到了MKL、FFT和Matlab的JIT。


我刚刚注意到这个回答被踩了(这对我来说是第一次)。有什么意见可以改进这个回答吗? - jorgeca
1
好的,我尝试了您提供的建议,使用不同的数组构造方式,在Numpy中也实现了约5倍的加速,这很棒。我尝试将此建议应用于我的高斯-赛德尔求解器上,但没有任何改进,这表明存在其他问题。在这个求解器中,我没有使用任何花哨的函数或其他东西,它基本上只是一个while循环,包含大约16行向量化赋值和几个控制语句。您在旧主题中写的内容对我也没有帮助。有没有办法可以将我的代码发送给您进行检查,或者在新问题中询问? - nicholls
1
由于问题似乎不同,您当然可以提出另一个问题,以便更多人受益! - jorgeca

3
您正在尝试重新创建NASA实验,但您已更改了许多变量。例如: 假设NASA的结果是正确的,则结果差异是由于这些变量中的一个或多个发生了变化。我建议您:
  • 使用SciPy预构建的二进制文件重新测试。
  • 研究是否相对于此类计算进行了任何改进MATLAB
此外,您可能会发现此链接有用。

1
我最初尝试与NASA的研究进行比较,但我主要是想看看是否有什么我可以做(或明显的事情),可能会导致Numpy的速度慢两倍。如果答案是我使用的MATLAB版本只是更快,那就是我所需要的。谢谢。 - nicholls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接