我是一名工科研究生,目前正在从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上做这件事。我需要这样做吗?
有什么建议吗?
你试图重新创建美国宇航局的实验,但是你已经改变了许多变量。例如:
假设美国航天局的结果是正确的,结果的差异是由于这些变化的变量中的一个或多个。我建议你:
另外,您可能会发现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。
相关问题 更多 >
编程相关推荐