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 上运行了 Gauss-Seidel 求解器,得到了类似的结果(16.5 s vs. 9.5 s)

我是 Python 的新手,在编程方面并不是非常有文化。我正在使用 WinPython 64 位 Python 发行版,但也尝试过 Pythonxy 无济于事。

我读过的应该提高性能的一件事是使用 MKL 构建 Numpy。不幸的是,我不知道如何在 Windows 上执行此操作。我什至需要这样做吗?

有什么建议么?

4

2 回答 2

59

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

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 of MATLAB speed 的问题的答案,其中谈到了 MKL、FFT 和 Matlab 的 JIT。

于 2013-07-09T23:03:37.127 回答
3

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

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

假设 NASA 的结果是正确的,那么结果的差异是由于这些变量中的一个或多个变化所致。我推荐你:

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

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

于 2013-07-09T22:51:42.070 回答