2011-05-18 89 views
12

我想用Python 2.6.5来计算大型矩阵(大约1000x1000)的特征值。我一直无法做到这一点。我还没有发现任何其他线程来解决这个问题。Python特征值计算在我的计算机上比MATLAB的运行速度慢得多。为什么?

当我在MATLAB中运行

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

大约需要30秒。 Python中的类似测试需要216秒。使用RPy通过R运行它并没有显着加速计算。八度测试花了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,所以我可能做了一些愚蠢的。如果我需要提供更多信息,请告诉我。

+1

您是否在Python和Matlab中使用相同的精度? – 2011-05-18 22:19:59

+2

您确实需要确保您的Python代码中的缩进是完全正确的。你的例子不能像写入那样运行。 – 2011-05-18 22:22:17

+0

为了让你知道你应该使用'rand'(均匀分布)或'randn'(正态分布),但不要混合它们。这并没有解释不同之处。 – Wok 2011-05-18 22:36:00

回答

3

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

我真的不通过这些数字感到惊讶作为MATLAB完全是一个数字和矩阵操作语言,它有它JIT加速器在python的优势,这是一种通用的语言。通常,MATLABpython+numpy之间的差异非常小,但在矩阵大小较大时变得明显,如同您的情况。

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

+2

该链接有问题。我似乎无法访问。 – Tshepang 2012-03-27 10:14:23

14

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

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

+3

这当然是它的一大部分。使用ATLAS比较numpy版本中的'np.linalg.eig'与链接MKL的'np.linalg.eig'会导致我的机器对于OP大小的数组差别大约3倍。 (10.1秒比3.2秒) – 2011-05-19 00:02:20

相关问题