我电脑上Python的特征值计算比MATLAB慢,为什么?

14 投票
2 回答
4113 浏览
提问于 2025-04-16 17:55

我想用Python 2.6.5来计算一些比较大的矩阵(大约1000x1000)的特征值。但我发现速度很慢,一直没找到其他人讨论这个问题的帖子。

当我在MATLAB中运行

a = rand(1000,1000);
tic;
for i =1:10
    eig(a);
end
toc;

时,大约需要30秒。而在Python中做同样的测试却要216秒。通过RPy在R中运行也没有明显加快计算速度。在Octave中测试则需要93秒。我对这种速度差异感到有些困惑。

我在网上找到的唯一类似的问题是这个,但那是几年前的帖子。发帖的人使用的Python目录结构和我不一样(我觉得可能是因为帖子太旧了,当然我也可能错了),所以我不太敢按照那里的说明去做。

我的包管理器显示我已经安装了LAPACK,并且在Python计算中使用了NumPy和SciPy:

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

我对Python还很陌生,可能做了什么傻事。如果需要我提供更多信息,请告诉我。

2 个回答

3

我确实看到时间上有差别,但没有你说的那么大。我用的 MATLAB(R2010b)大约需要25秒,而 python(2.7)大约需要60秒。

这些数字我倒不太惊讶,因为 MATLAB 主要是用来处理数字和矩阵的,它在这方面比 python 有优势,尤其是 MATLAB 有个叫 JIT 的加速器,而 python 是个通用语言。一般来说,MATLABpython+numpy 之间的差别不大,但当矩阵很大的时候,这个差别就会显现出来,就像你说的那样。

这并不意味着没有办法提高 python 的性能。你可以去看看 PerformancePython 这篇文章,它在 scipy 的网站上,介绍了几种可以提升 python 性能的方法。

15

我觉得你看到的情况是,Matlab使用的是英特尔数学核心库(MKL),而你系统上可能有的LAPACK实现(可能是ATLAS?)是SciPy所链接的。这两者的速度差别很大,你可以在这些基准测试中看到MKL的速度有多快。

我想如果你能把SciPy重新编译成使用英特尔MKL库,性能会好很多。如果你在使用Windows,可以从这里下载预编译的版本,或者你也可以考虑使用像Enthought Python Distribution这样的工具。

撰写回答