为什么在我的计算机上,Python的特征值计算比MATLAB慢得多?

14
我想使用Python 2.6.5计算较大矩阵(大约1000x1000)的特征值。但我发现计算速度很慢,而且没有找到其他解决此问题的线程。在运行时,代码如下:

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

在MATLAB中计算需要大约30秒,在Python中进行类似的测试需要216秒。使用RPy运行它并没有显著加快计算速度。在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

我对Python还不太了解,所以可能做错了什么。如果需要更多信息,请告诉我。


1
你在Python和Matlab中使用相同的精度吗? - Dietrich Epp
2
你需要确保Python代码中的缩进完全正确。你的示例无法按照原样运行。 - S.Lott
只是提醒您,应该使用rand(均匀分布)或randn(正态分布),但不要混用它们。这并没有解释它们之间的区别。 - Wok
svd 的时间会是多少?另外,请正确重新格式化您的代码,不要导入您没有使用的内容,并请尽量避免使用习语 from . import *。谢谢。 - eat
我已经尝试过svd(没有循环的情况下为3秒)和eigvals(12秒),与eig的30秒相比较。虽然使用svd,你只能得到a'*a的奇异值,而不是a本身。 - Wok
我指的是a'*a的特征值的平方根。 - Wok
2个回答

15

我认为你看到的是Matlab使用的Intel Math Kernel Library (MKL)与你系统上所链接的Scipy使用的LAPACK实现(可能是ATLAS)之间的区别。你可以在这些基准测试中看到MKL的速度要快得多。

如果你能重新编译Scipy来使用Intel MKL库,那么你肯定会得到更好的性能。如果你使用Windows,可以从这里下载预编译版本,或者考虑使用Enthought Python Distribution。


3
当然,这是其中很大一部分。将numpy的版本使用ATLAS与链接到MKL的版本的np.linalg.eig进行比较,对于OP所使用的数组大小,在我的机器上结果相差大约3倍(10.1秒与3.2秒)。 - Joe Kington

3
我确实有时间差异,但不像你的那么激烈。我的MATLAB(R2010b)时间是约25秒,而Python(2.7)时间是约60秒。
我对这些数字并不感到惊讶,因为MATLAB仅是一种数字和矩阵操作语言,并且它具有其JIT加速器的优势,而Python是一种通用语言。通常,MATLAB和Python + numpy之间的差异非常小,但在矩阵大小很大时会变得明显,就像你的情况一样。
这并不意味着没有改进Python性能的方法。Scipy网站上的PerformancePython文章介绍了不同的提高Python性能的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接