MATLAB的速度是Numpy的两倍

nic*_*lls 21 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)
Run Code Online (Sandbox Code Playgroud)

鉴于我正在使用的MATLAB 2012a:

a = rand(5000,5000,3);

tic;
a(:,:,1) = a(:,:,2);
a(:,:,3) = a(:,:,1);
a(:,:,2) = a(:,:,3);
toc
Run Code Online (Sandbox Code Playgroud)

我使用的算法是在NASA 网站上使用的比较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上执行此操作.我甚至需要这样做吗?

有什么建议?

jor*_*eca 57

由于缓存,这种比较最终会变成苹果到橙子,因为传输或在连续的内存块上做一些工作更有效.这个特定的基准测试是内存限制的,因为实际上没有进行任何计算,因此高速缓存命中的百分比是实现良好性能的关键.

Matlab以列主要顺序(Fortran顺序)放置数据,因此a(:,:,k)是一个连续的内存块,可以快速复制.

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

对于numpy-MKL和plain numpy,这个结果应该非常相似,因为MKL是一个快速的LAPACK实现,在这里你不会调用任何使用它的函数(MKL在解决线性系统,计算点积......时肯定有帮助).

我真的不知道Gauss Seidel解算器上发生了什么,但前段时间我写了一个题为Numpy的问题的答案,该问题的运行速度只有MATLAB的一半,它讲述了MKL,FFT和Matlab的JIT.