matlab

2013-06-21 17 views
5

Ben hiçbir şey yapmadan, aynı makinede python 2.7 ve matlab R2010a çalıştırmak daha 10x daha yavaş olduğunu ve çevrimiçi baktımmatlab

hız beni 10x farklı sağlar ve aynı olmalıdır duydu sipariş. Python, ifade için

olarak sanki daha yavaşlayacaktır. Sorum şu: Bu gerçek mi? Ya da aynı hız düzeninde başka bir yol var mı? İşte


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 
İşte

Output: time cost = 0.0377440452576

olan piton kodu matlab kodu

tic 

for i = 1:1000 

    for j = 1:1000 

    end 

end 

toc 

Output: Escaped time is 0.004200 seconds

+0

Ben de yokum derleyici en iyileştiricisi için herhangi bir fark, ancak devam etmek yerine geçmek deneyin mi? Belki çok basit bir hesaplama eklerseniz, 't = t + 1' o zaman değişecektir. – slbass

+0

Döngüyü "python -m timeit" ile test etmek, 'pass'ı kullanarak' devam et 'seçeneğinin biraz daha yavaş olduğunu, ancak önemli bir şekilde olmadığını gösterir. Makinemde, döngüler, OP'nin iddia ettiği şeylerin yarısından daha az olan 16 msn alır. Ayrıca MATLAB'ın bir [JIT] (http://www.matlabtips.com/matlab-is-no-longer-slow-at-for-loops/) olduğunu unutmayın, dolayısıyla bu gibi farklılıklar beklenir * özellikle * ile basit döngüler. – Bakuriu

+3

Matlab'ın, döngülerin aslında hiçbir şey yapmadığını ve bunları en iyi duruma getirdiğini fark edebilecek kadar akıllı olduğu durumlarda, döngü içinde bir şey koymaya değer olabilir. – Aya

cevap

2

Python hayırlısı ise ise iyon performansı PyPy

bakmak olabilir, sizin için gerçekten çok önemlidir yaptım test:

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 

standart Python 2.7.3, ben alıyorum:

0.0311839580536 
0.0310959815979 
0.0309510231018 
0.0306520462036 
0.0302460193634 
0.0324130058289 
0.0308878421783 
0.0307397842407 
0.0304911136627 
0.0307500362396 

oysa (Python 2.7.2 karşılık gelir) PYPY 1.9.0 kullanarak elde:

0.00921821594238 
0.0115230083466 
0.00851202011108 
0.00808095932007 
0.00496387481689 
0.00499391555786 
0.00508499145508 
0.00618195533752 
0.005126953125 
0.00482988357544 

hızlanma o f PyPy gerçekten çok etkileyici ve JIT derleyici optimizasyonları maliyetlerini aştığında gerçekten görünür hale geliyor. Bu yüzden de fazladan döngüyü tanıttım. Bu örnekte, kesinlikle kodun değiştirilmesine gerek yoktur.

+3

PyPy ile ilgili sorun hala NumPy'yi desteklememesidir, bu yüzden ideal bir MATLAB değişimi değildir. –

8

Bunun nedeni, MATLAB for döngüsünü optimize eden JIT derleyicisiyle ilgilidir. JT hızlandırıcıyı feature accel off ve feature accel on kullanarak devre dışı bırakabilir/etkinleştirebilirsiniz. Hızlandırıcıyı kapattığınızda, zamanlar önemli ölçüde değişir. Hızlanma kapalıyken Elapsed time is 0.009407 seconds.

MATLAB: üzerinde Hızlanma ile

MATLAB Elapsed time is 0.287955 seconds.

piton:

time cost = 0.0511920452118 Böylece JIT hızlandırıcı doğrudan fark edilir hızlanma neden oluyor. Yinelemeli indeksleri tanımladığınız yolla ilgili olarak düşünmeniz gereken başka bir şey vardır. Her iki durumda da MATLAB ve python, döngülerinizi tanımlamak için Yineleyicileri kullandınız. MATLAB'de, köşeli parantezleri ([]) ekleyerek gerçek değerleri yaratırsınız ve python'da xrange yerine range kullanırsınız.Hızlanma kapalıyken Elapsed time is 0.338701 seconds.

MATLAB: Eğer kere üzerinde ivmesinden ile

MATLAB haline

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

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

bu değişiklikleri yaparken Elapsed time is 0.289220 seconds.

piton: time cost = 0.0606048107147

Son bir husustur Döngüye hızlı bir hesaplama ekleyecekseniz. t=t+1. Hızlanma kapalıyken Elapsed time is 1.340830 seconds.

MATLAB: Sonra kez üzerinde ivmesinden ile

MATLAB haline Elapsed time is 0.905956 seconds. (Evet kapalı daha hızlıydı)

piton: time cost = 0.147221088409

Burada ahlaki olduğunu düşünüyorum Kutuya göre döngüler için hesaplama hızları, duruma bağlı olarak son derece basit döngüler için karşılaştırılabilir. Ancak, python'da işleri hızlandırabilecek diğer sayısal araçlar da vardır.

+0

Python'un 'xrange' basit bir yineleyicidir. MATLAB versiyonunu python'unki ile karşılaştırmak isterseniz düz 'range' kullanmalısınız. – Bakuriu

+0

@Bakuriu Haklısın, hiç bir şey değişmemiş olmasına rağmen yayınımı kullanım aralığını değiştirdim ve çalışma zamanını güncelledim. – slbass

+0

Aynı kod bloklarını karşılaştırırsanız, ancak Matlab'ın i = 1: 1000' için Python 2.x'in 'xrange' ile karşılaştırmasını yaparsanız hangi sonuçları alırsınız? – Aya

3

Temel Python uygulaması, CPython'un süper hızlı olması amaçlanmamıştır. Etkin matlab stili sayısal manipülasyona ihtiyacınız varsa, the numpy package veya PyPy veya Cython gibi hızlı çalışma için tasarlanmış bir Python uygulamasını kullanın. (Tabii ki oldukça hızlı olacak, C bir Python uzantısı yazma, aynı zamanda olası bir çözümdür, ancak bu durumda da sadece numpy kullanın ve kendinizi çabadan tasarruf edebilirsiniz.)