MATLAB是Numpy的两倍

2024-05-19 16:09:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一名工科研究生,目前正在从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

我正在使用的算法是NASAwebsite上使用的算法,它比较了Numpy和MATLAB。网站显示,Numpy的速度超过了MATLAB。但我的结果显示Numpy的模拟时间为0.49s,而MATLAB的模拟时间为0.29s。我还在Numpy和Matlab上运行了Gauss-Seidel解算器,得到了类似的结果(16.5s vs.9.5s)

我是Python的新手,对编程不是很精通。我使用的是WinPython 64位Python发行版,但也尝试过Pythonxy,但没有成功。

我读过一篇文章,应该提高性能,那就是使用MKL构建Numpy。不幸的是,我不知道如何在Windows上做这件事。我需要这样做吗?

有什么建议吗?


Tags: importnumpy算法timenp时间tic速度
3条回答

你试图重新创建美国宇航局的实验,但是你已经改变了许多变量。例如:

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

假设美国航天局的结果是正确的,结果的差异是由于这些变化的变量中的一个或多个。我建议你:

  • 用SciPy预先构建的binaries重新测试。
  • 研究是否对与此类计算相关的MATLAB进行了任何改进。

另外,您可能会发现this link很有用。

由于缓存的缘故,这种比较最终变成了苹果对橘子的比较,因为在连续的内存块上传输或做一些工作更为有效。这个特定的基准是内存限制的,因为实际上没有计算,因此缓存命中率是获得良好性能的关键。

Matlab将数据按列主顺序(Fortran顺序)放置,因此a(:,:,k)是一个连续的内存块,复制速度很快。

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

对于numpy MKL和普通numpy,这个结果应该非常相似,因为MKL是一个快速的LAPACK实现,在这里您不会调用任何使用它的函数(MKL在解决线性系统、计算点产品时绝对有帮助…)。

我真的不知道Gauss-Seidel解算器是怎么回事,但前一段时间我写了一个题为Numpy running at half the speed of MATLAB的问题的答案,其中谈到了MKL、FFT和Matlab的JIT。

由于缓存的缘故,这种比较最终变成了苹果对橘子的比较,因为在连续的内存块上传输或做一些工作更为有效。这个特定的基准是内存限制的,因为实际上没有计算,因此缓存命中率是获得良好性能的关键。

Matlab将数据按列主顺序(Fortran顺序)放置,因此a(:,:,k)是一个连续的内存块,复制速度很快。

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

对于numpy MKL和普通numpy,这个结果应该非常相似,因为MKL是一个快速的LAPACK实现,在这里您不会调用任何使用它的函数(MKL在解决线性系统、计算点产品时绝对有帮助…)。

我真的不知道Gauss-Seidel解算器是怎么回事,但前一段时间我写了一个题为Numpy running at half the speed of MATLAB的问题的答案,其中谈到了MKL、FFT和Matlab的JIT。

相关问题 更多 >