【问题标题】:Python eigenvalue computations run much slower than those of MATLAB on my computer. Why?在我的计算机上,Python 特征值计算的运行速度比 MATLAB 慢得多。为什么?
【发布时间】:2011-08-28 10:39:26
【问题描述】:

我想使用 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 很陌生,所以我可能做了一些愚蠢的事情。如果我需要提供更多信息,请告诉我。

【问题讨论】:

  • 你在 Python 和 Matlab 中使用的精度是一样的吗?
  • 您确实需要确保您在 Python 代码中的缩进是完全正确的。您的示例无法按书面方式运行。
  • 只是为了让您知道您应该同时使用rand(均匀分布)或randn(正态分布),但不要混合使用它们。但这并不能解释差异。
  • svd 的时间安排是什么?另外,请正确重新格式化您的代码,不要导入您不使用的东西,并尽量避免使用成语from . import *。谢谢
  • 我尝试了svd(3 秒没有循环)和eigvals(12 秒),与eig 的 30 秒相比。虽然,使用svd,您只能得到 a'*a 的奇异值,而不是 a。

标签: python matlab numpy eigenvalue


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这当然是其中很大一部分。比较使用 ATLAS 的 numpy 版本上的 np.linalg.eig 与链接到 MKL 的版本,结果在我的机器上对于 OP 大小的数组存在大约 3 倍的差异。 (10.1 秒对 3.2 秒)
    最近更新 更多