14

我想使用 Python 2.6.5 计算大型矩阵(约 1000x1000)的特征值。我一直没能这么快。我还没有找到任何其他线程来解决这个问题。

当我跑

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

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

我能在网上找到的唯一一个像这样的问题的例子是this,它已经有几年的历史了。该问题中的海报具有不同的 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 很陌生,所以我可能做了一些愚蠢的事情。如果我需要提供更多信息,请告诉我。

4

2 回答 2

15

我认为您所看到的是 Matlab 使用的英特尔数学内核库 (MKL) 与 scipy 链接的系统上的任何 LAPACK 实现(可能是 ATLAS?)之间的区别。您可以在这些基准测试中看到 MKL 的速度有多快。

我想如果您可以针对英特尔 MKL 库重建 Scipy,您将获得更好的性能。如果您使用的是 Windows,可以从这里下载预构建的副本,或者您可以考虑使用 Enthought Python Distribution 之类的东西。

于 2011-05-18T23:33:05.090 回答
3

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

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

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

于 2011-05-18T22:53:01.247 回答