2011-05-18 102 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

相關問題