Python vs. Ruby 1.9 YARV. Cz. II

Opublikowane przez Jarosław Zabiełło Sat, 06 Jan 2007 17:44:00 GMT

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, i

Ruby

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:

  1. Python 2.5: 3.86356806755 s.
  2. Python 2.4 4.09678792953 s.
  3. Ruby 1.9: 6.418052 s.
  4. 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.

Tagi , , ,  | 10 comments

Comments

  1. Avatar Seban powiedział about 5 hours later:

    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

  2. Avatar ja powiedział about 8 hours later:

    :P

  3. Avatar wysek powiedział 10 days later:

    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ą…

  4. Avatar Jarosław Zabiełło powiedział 10 days later:

    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.

  5. Avatar marcus powiedział 11 months later:

    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..

  6. Avatar Jarosław Zabiełło powiedział 11 months later:

    Zapuściłem ten sam kod na najnowszym (svn r5317) JRuby z opcjami -J-server -J-Djruby.compile.frameless=true i uzyskałem 3.83 s. czyli taki jak najlepszy tu wynik Pythona. A to jeszcze nie wszystko. JRuby jest wciąż optymalizowany…

  7. Avatar marcus powiedział about 1 year later:

    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?

  8. Avatar Jarosław Zabiełło powiedział about 1 year later:

    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ść.

  9. Avatar marcus powiedział about 1 year later:

    zgadza się sprawdziłem z jruby1.1 i czasy niemal identyczne z pythonem 2.5 (setne różnice)

  10. Avatar dmilith powiedział over 2 years later:

    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

(leave url/email »)

   Pomoc języka formatowania Obejrzyj komentarz