Python特征值计算比我计算机上的MATLAB运行速度慢得多.为什么?

Jam*_*e D 13 python matlab numpy eigenvalue

我想使用Python 2.6.5计算大型矩阵(约1000x1000)的特征值.我一直无法做到这一点.我还没有发现任何其他线程来解决这个问题.

我跑的时候

a = rand(1000,1000);
tic;
for i =1:10
    eig(a);
end
toc;
Run Code Online (Sandbox Code Playgroud)

在MATLAB中大约需要30秒.Python中的类似测试需要216秒.使用RPy通过R运行它并没有明显加快计算速度.Octave的测试耗时93秒.我对速度上的差异感到有点困惑.

我可以在网上找到这样一个问题的唯一例子就是这个,这已经有好几年了.该问题中的海报有一个不同的Python目录结构(我将其归因于帖子的年龄,虽然我可能会弄错),所以我没有足够的信心尝试按照记者发布的说明进行操作.

我的包管理器说我安装了LAPACK,我使用NumPy和SciPy进行Python计算:

from numpy import *
from scipy import *
from numpy.linalg import *
import time

a = randn(1000,1000)
tic = time.clock()
for i in range(0,10):
    eig(a)
toc = time.clock()
print "Elapsed time is ", toc-tic
Run Code Online (Sandbox Code Playgroud)

我是Python的新手,所以我可能做了些傻事.如果我需要提供更多信息,请告诉我.

Ray*_*Ray 15

我认为您所看到的是Matlab使用的英特尔数学核心库(MKL)与您在系统上的任何LAPACK实现(ATLAS,可能是?)之间的差异,而scipy与之相关联.您可以看到MKL在这些基准测试中的速度有多快.

我想如果你能够针对英特尔MKL库重建Scipy,你会获得更好的性能.如果您使用的是Windows,可以从此处下载预构建的副本,或者您可以考虑使用类似Enthought Python Distribution的内容.

  • 这当然是其中很大一部分.比较使用ATLAS的numpy版本上的`np.linalg.eig`与使用MKL链接的numpy版本导致在我的机器上对于OP的大小数组大约有3倍的差异.(10.1秒vs 3.2秒) (3认同)

abc*_*bcd 3

我确实在时间上有所不同,但没有你的那么剧烈。我的MATLAB(R2010b) 计时约为 25 秒,python(2.7) 计时约为 60 秒。

我对这些数字并不感到惊讶,因为它只是一种数字和矩阵操作语言,并且它比通用语言具有加速器MATLAB的优势。一般来说,和 之间的差异非常小,但当矩阵大小很大时,就像你的情况一样,差异就会变得明显。JITpythonMATLABpython+numpy

这并不意味着没有方法可以提高 python 的性能。scipy 网站上的 PerformancePython文章很好地介绍了提高 python 性能的不同方法。