Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python特征值计算比我的计算机上的MATLAB运行得慢得多。为什么?_Python_Matlab_Numpy_Eigenvalue - Fatal编程技术网

Python特征值计算比我的计算机上的MATLAB运行得慢得多。为什么?

Python特征值计算比我的计算机上的MATLAB运行得慢得多。为什么?,python,matlab,numpy,eigenvalue,Python,Matlab,Numpy,Eigenvalue,我想使用Python 2.6.5计算大型ish矩阵(约1000x1000)的特征值。我一直无法这么快做到。我没有发现任何其他线程解决这个问题 当我跑的时候 a = rand(1000,1000); tic; for i =1:10 eig(a); end toc; 在MATLAB中,大约需要30秒。Python中的类似测试需要216秒。使用RPy在R中运行它并没有明显加快计算速度。八度音阶测试耗时93秒。我对速度上的差异感到有点困惑 我能在网上找到的像这样的问题的唯一例子是,已经有好几

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

当我跑的时候

a = rand(1000,1000);
tic;
for i =1:10
    eig(a);
end
toc;
在MATLAB中,大约需要30秒。Python中的类似测试需要216秒。使用RPy在R中运行它并没有明显加快计算速度。八度音阶测试耗时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新手,所以我可能做了一些愚蠢的事情。如果我需要提供更多信息,请告诉我

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

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


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

我认为您看到的是Matlab使用的英特尔数学内核库(MKL)与scipy所链接的系统(ATLAS,也许?)上的任何LAPACK实现之间的差异。你可以看到MKL的速度有多快


我想,如果您能够针对英特尔MKL库重建Scipy,您将获得更好的性能。如果您使用Windows,预下载的副本可以从中下载,或者您可以考虑使用类似于Python Python分发的东西。

您在Python和Matlab中使用相同的精度吗?您确实需要确保Python代码中的缩进是完全正确的。您的示例无法按编写的方式运行。为了让您知道,您应该同时使用
rand
(均匀分布)或
randn
(正态分布),但不能将它们混合使用。但这并不能解释差异。svd的计时是什么?另外,请正确地重新格式化您的代码,不要导入您不使用的内容,请尽量避免使用成语
。导入*
。ThanksI尝试了
svd
(无循环3秒)和
eigvals
(12秒),与
eig
的30秒进行比较。虽然,使用
svd
,您只能得到a'*a的奇异值,而不是a。这当然是其中的很大一部分。在使用ATLAS的numpy版本上比较
np.linalg.eig
,与使用MKL链接的numpy版本相比,我的机器上OP大小的数组相差大约3倍。(10.1秒对3.2秒)