python - MATLAB 的速度是 Numpy 的两倍

标签 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 上执行此操作。我什至需要这样做吗?

有什么建议吗?

最佳答案

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

Matlab 以列优先顺序(Fortran 顺序)放置数据,因此 a(:,:,k) 是一 block 连续的内存,可以快速复制。

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

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

我真的不知道 Gauss Seidel 求解器发生了什么,但前段时间我写了一个标题为 Numpy running at half the speed of MATLAB 的问题的答案。稍微讲了一点 MKL、FFT 和 Matlab 的 JIT。

关于python - MATLAB 的速度是 Numpy 的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559140/

相关文章:

python - 如何在 Google App Engine 中包含 python-dateutil?

mysql - 多表还是单表有多种类型?

performance - SQL Server 2008 FILESTREAM性能

php - 在数据映射器模式中,是否值得跟踪哪些字段发生了变化?

matlab - 使用和理解 MATLAB 的 TreeBagger(随机森林)方法

python - 如何在 pydot 中的两个子图之间添加边?

python - 使用迭代器的最快(最 Pythonic)方式

image - 如何在 Matlab 中获取图像中存在的 n 条曲线的长度?

javascript - Ajax 调用 Python 脚本。我缺少什么?

matlab - 删除空结构字段 Matlab