2013-06-21 85 views
5

我在同一臺機器上運行的Python 2.7和MATLAB R2010a版本,什麼都不做要慢10倍,它給我的速度在蟒蛇環比MATLAB

我在網上看了10倍不同,聽到它應該是相同的訂購。 Python會進一步下降放緩,if語句和數學運算符在for循環

我的問題:這是現實?或者有其他方式讓他們在相同的速度順序?


這裏是Python代碼

import time 

start_time = time.time() 

for r in xrange(1000): 

     for c in xrange(1000): 

     continue 

elapsed_time = time.time() - start_time 

print 'time cost = ',elapsed_time 

Output: time cost = 0.0377440452576

這裏是MATLAB代碼

tic 

for i = 1:1000 

    for j = 1:1000 

    end 

end 

toc 

Output: Escaped time is 0.004200 seconds

+0

如果存在與編譯器優化器有什麼不同,但是您是否嘗試通過而不是繼續?也許如果你添加一個非常基本的計算,'t = t + 1',那麼它會改變。 – slbass

+0

使用'python -m timeit'測試循環顯示使用'pass'比'continue'慢一點,但不是很重要。在我的機器上,環路需要16毫秒,這比OP聲稱的要少一半。還要注意,MATLAB有一個[JIT],因此這種差異是可以預期的*尤其是*簡單循環。 – Bakuriu

+3

可能值得在循環內部放置一些東西,以防萬一Matlab能夠足夠聰明地認識到循環實際上沒有做任何事情,並且優化了它們。 – Aya

回答

2

如果Python的EXECUT離子的性能是真的對你重要,你可能會在PyPy

看看我做了測試:

import time 
for a in range(10): 
    start_time = time.time() 
    for r in xrange(1000): 
     for c in xrange(1000): 
      continue 

    elapsed_time = time.time()-start_time 
    print elapsed_time 

與標準Python 2.7.3,我得到:

0.0311839580536 
0.0310959815979 
0.0309510231018 
0.0306520462036 
0.0302460193634 
0.0324130058289 
0.0308878421783 
0.0307397842407 
0.0304911136627 
0.0307500362396 

然而,使用PyPy 1.9.0(對應於Python 2.7.2),我得到:

0.00921821594238 
0.0115230083466 
0.00851202011108 
0.00808095932007 
0.00496387481689 
0.00499391555786 
0.00508499145508 
0.00618195533752 
0.005126953125 
0.00482988357544 

加速度o ˚FPyPy是非常驚人的,當它的JIT編譯器優化超過其成本確實變得可見。這也是爲什麼我介紹額外的循環。對於這個例子,絕對不需要修改代碼。

+3

PyPy的問題是它仍然不支持NumPy,所以它不是一個理想的MATLAB替代品。 –

8

出現這種情況的原因涉及到JIT編譯器,這是優化MATLAB for循環。您可以禁用/啓用使用feature accel offfeature accel on的JIT加速器。當你禁用加速器時,時間會發生巨大變化。

MATLAB與加速度:Elapsed time is 0.009407 seconds.

MATLAB與加速度關閉:Elapsed time is 0.287955 seconds.

蟒蛇:time cost = 0.0511920452118

因此,JIT加速直接導致你都注意到了加速。還有一件事,你應該考慮,這是關係到你所定義的迭代指數的方式。在這兩種情況下,MATLAB和Python中,您使用迭代器來定義您的循環。在MATLAB中,通過添加方括號([])來創建實際值,而在Python中,您使用range而不是xrange。當你做出這些改變

% MATLAB 
for i = [1:1000] 
    for j = [1:1000] 

# python 
for r in range(1000): 
    for c in range(1000): 

時代成爲

MATLAB與加速度:Elapsed time is 0.338701 seconds.

MATLAB與加速度關閉:Elapsed time is 0.289220 seconds.

蟒蛇:time cost = 0.0606048107147

最後一個考慮因素是如果你要爲循環添加一個快速計算。即t=t+1。然後時間變得

MATLAB與加速度:Elapsed time is 1.340830 seconds.

MATLAB與加速度關閉:Elapsed time is 0.905956 seconds.(是關是更快)

蟒蛇:time cost = 0.147221088409

我認爲這裏的道德是,根據具體情況,for循環的開箱即用的計算速度相當於極其簡單的循環。然而,python中還有其他一些數值工具可以顯着加快速度,numpy和PyPy已經被提出。

+0

Python的'xrange'是一個簡單的迭代器。如果你想比較MATLAB版本和Python版本,你應該使用普通的'range'。 – Bakuriu

+0

@Bakuriu你是對的,我改變了我的帖子使用範圍和更新運行時,雖然沒有真正改變。 – slbass

+0

如果你比較相同的代碼塊,但使用Matlab的'for i = 1:1000'與Python 2.x的'xrange',你會得到什麼結果? – Aya

3

基本的Python實現CPython並不意味着超速。如果您需要高效的matlab風格的數值處理,請使用the numpy package或專爲快速工作而設計的Python實現,例如PyPy或Cython。 (在C中編寫一個Python擴展,當然速度很快,也是一個可行的解決方案,但是在這種情況下,你可能只需要使用numpy並且省下不少努力。)