Python vs. Ruby 1.9 YARV. Cz. II
Opublikowane przez Jarosław Zabiełło
Z wcześniejszych testów wynikało że Ruby 1.9 (wykorzystujący wirtualną maszynę YARV) jest szybszy od Pythona. Aby zwolennicy Rubiego zbyt się nie cieszyli, przygotowałem test na wywołania rekurencyjne. Najcięższą jest tu funkcja rekurencyjna. Długość 7 znaków daje prawie 900 tys. wywołań rekurencyjnych i w miarę sensowne czasy aby coś zobaczyć. Postanowiłem ją wziąć na rozkład. Tym razem z 10 prób brany jest najlepszy (najkrótszy) wynik.
Python:
try:
import psyco
psyco.all()
except:
pass
from time import time
def wariancje(s, n):
if n==0:
yield []
else:
for i in xrange(len(s)):
for c in wariancje(s, n-1):
yield [s[i]] + c
s = "abcdefg"
nelem = len(s)
i = 0
results = []
for unused in range(10):
t = time()
for s in wariancje(s, nelem):
i += 1
tmp = time() - t
results.append(tmp)
print tmp
print min(results), max(results), nelem, iRuby
def wariancje(s, n)
if n == 0
yield []
else
s.size.times do |i|
wariancje(s, n-1) { |c| yield [s[i]] + c }
end
end
end
t = Time.now
s = "abcdefg"
size = s.size
i = 0
results = []
10.times do
t = Time.now
wariancje(s, size) do
i += 1
end
tmp = Time.now - t
results << tmp
puts tmp
end
puts "\n#{results.min}, #{results.max}, #{size}, #{i}"Rezultat:
- Python 2.5: 3.86356806755 s.
- Python 2.4 4.09678792953 s.
- Ruby 1.9: 6.418052 s.
- Ruby 1.8.5: 8.000223 s.
Tym razem Python nie dał szans Rubiemu. Jest od niego wyraźnie szybszy. Jednak na obronę można powiedzieć że YARV nie jest tu jeszcze zbyt zoptymalizowany. Wiele opcji optymalizacyjnych ma po prostu wyłączonych, Ruby 1.9 i YARV to na razie kod eksperymentalny. Na razie więc dominacja wydajnościowa Pythona jest niepodważalna.



Myślę, że trzeba zwrócić większą uwagę na różnice między Ruby 1.8 a 1.9. Do Pythona daleko, ale widać postęp, jeśli dalej się tak będzie rozwijał to będzie dobrze
:P
Bez urazy, ale liczność próby wynosząca 10 to trochę mało, do tego brane najszybsze wyniki… Nie ma to nic wspólnego ze statystyką…
Nie sądzę aby większa ilość prób cokolwiek zmieniła. Zresztą zrób sam testy. Python jest szybszy od Rubiego gdy w grę wchodzą wywołania metod. Wszyscy to przyznają. YARV dobrze wróży Rubiemu na przyszłość. Ale na razie jeśli weźmiemy pod uwagę tylko wersje stabilne, to Python będzie szybszy we wszystkich kategoriach.
twój algorytm puściłem pod php i na mojej maszynie wyszły następujące wyniki:
Python 2.5 – 8 s. Ruby 1.8.6 – 29 s. PHP 4 – 22s. PHP 5 – 16 s.
nie testowałem jedynie dla Ruby 1.9, ale już widać, że Ruby 1.8x to żółw..
Zapuściłem ten sam kod na najnowszym (svn r5317) JRuby z opcjami
-J-server -J-Djruby.compile.frameless=truei uzyskałem 3.83 s. czyli taki jak najlepszy tu wynik Pythona. A to jeszcze nie wszystko. JRuby jest wciąż optymalizowany…spróbowałem twoich opcji i z pewnością działało szybciej niż samo jruby, ale otrzymałem czasy 59-60 s (python 8s.), więc jak to wytłumaczysz ? testowałem na jruby1.0 czyżby aż tak podkręcili obecnie nową wersję jruby?
JRuby 1.1 jest dużo szybszy od 1.0. I to powinno jeszcze trochę się powiększyć bo jeszcze nie ma finalnej wersji. Wersja 1.0 nie była optymalizowana na wydajność.
zgadza się sprawdziłem z jruby1.1 i czasy niemal identyczne z pythonem 2.5 (setne różnice)
dmilith:(/Projekty)$ java -version java version “1.6.0_07” Java™ SE Runtime Environment (build 1.6.0_07-b06-153) Java HotSpot™ 64-Bit Server VM (build 1.6.0_07-b06-57, mixed mode)
dmilith:(/Projekty)$ jruby -J-server -S ./test_jruby.rb 3.655 2.621 2.595 2.586 2.593 2.621 2.632 2.594 2.624 2.629
2.586, 3.655, 7, 8235430
JRuby 1.2RC z trunka (GIT). MBP 2.4GHz/4GiB RAM