Python 2.5 30% schneller als 2.4?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BlackJack

Ein Nachteil ist, dass es oft nur etwas bei Funktionen bringt, die mehr als einmal aufgerufen werden. Der erste Aufruf ist nämlich unter Umständen langsamer als gewöhnlich, weil dabei die Übersetzung in Maschinencode angestossen wird.

Ausserdem steigt der Speicherverbrauch an, insbesondere wenn eine Funktion mit den verschiedensten Typen aufgerufen wird, weil es dann für jede Variante eine spezialisierte Maschinenspracheroutine gibt.

Es kann also durchaus Sinn machen nicht alles unter Psyco zu stellen, sondern nur gezielt die Flaschenhälse übersetzen zu lassen.
polypus
User
Beiträge: 37
Registriert: Dienstag 27. September 2005, 14:11
Wohnort: Salzburg

Hallo!
Ich hab mal einen Vergleich von 2.4 und 2.3 gemacht.

Ich habe eine Fakultätsfunktion zum Vergleich verwendet:

Code: Alles auswählen

import time

def fac(x):
    if x == 0:
        return 1
    else:
        x = x*fac(x-1)
        return x

def time_fac(repeats):
    st = time.time()
    i = 0
    while i <= repeats:
        fac(30)
        i += 1
    et = time.time()
    print "Runtime %s" % (et-st)
Mit Python 2.3:

Code: Alles auswählen

>>> time_fac(25000)
Runtime 1.43181419373
>>> time_fac(25000)
Runtime 1.45611190796
>>> time_fac(25000)
Runtime 1.42871999741
>>> time_fac(25000)
Runtime 1.41866183281
>>> time_fac(25000)
Runtime 1.43753600121
Mit Python 2.4:

Code: Alles auswählen

>>> time_fac(25000)
Runtime 0.769237041473
>>> time_fac(25000)
Runtime 0.768352031708
>>> time_fac(25000)
Runtime 0.770421981812
>>> time_fac(25000)
Runtime 0.835741043091
>>> time_fac(25000)
Runtime 0.773319959641
Muss die Funktion noch auf 2.5 testen, aber mir kommt der Unterschied schon mächtig vor...

Auf einem unserer starken Rechner, schauts mit 2.4 dann so aus:

Code: Alles auswählen

>>> time_fac(25000)
Runtime 0.383197069168
>>> time_fac(25000)
Runtime 0.384837865829
>>> time_fac(25000)
Runtime 0.368741035461
>>> time_fac(25000)
Runtime 0.369416952133
>>> time_fac(25000)
Runtime 0.384665966034
8)
BlackJack

Zwischen 2.4 und 2.5 kann ich keinen so gravierenden Unterschied feststellen:

Python 2.4:

Code: Alles auswählen

In [52]: for dummy in xrange(10):
   ....:     test.time_fac(25000)
   ....:
Runtime 1.23738694191
Runtime 0.98073387146
Runtime 0.572645902634
Runtime 0.57325720787
Runtime 0.572843074799
Runtime 0.572781085968
Runtime 0.572861909866
Runtime 0.572387933731
Runtime 0.572809934616
Runtime 0.572164058685
Python 2.5:

Code: Alles auswählen

>>> for dummy in xrange(10):
...     test.time_fac(25000)
...
Runtime 1.09599494934
Runtime 0.557917118073
Runtime 0.545745849609
Runtime 0.557101964951
Runtime 0.544756889343
Runtime 0.550202846527
Runtime 0.557132005692
Runtime 0.551975011826
Runtime 0.557483911514
Runtime 0.549374103546
Die "Beschleunigung" innerhalb der beiden Tests liegt am Powermanagement das erst nach ein wenig CPU-Last den Prozessortakt auf volle Leistung hochschraubt.
polypus
User
Beiträge: 37
Registriert: Dienstag 27. September 2005, 14:11
Wohnort: Salzburg

Hmm... soll uns das jetzt wundern? :D

Vermutlich steckt der Teufel im Detail und soweit reicht mein Wissen nicht...
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Wenn ich die Blogposts von Effbot richtig in Erinnerung habe, wurde besonders bei Strings in Py2.5 viel optimiert. Also vielleicht mal mit Strings anstelle von Zahlen Vergleiche machen.
Antworten