Seite 1 von 1
Verfasst: Dienstag 27. März 2007, 17:33
von 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.
Verfasst: Montag 2. April 2007, 15:34
von polypus
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

Verfasst: Montag 2. April 2007, 16:24
von 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.
Verfasst: Dienstag 3. April 2007, 07:27
von polypus
Hmm... soll uns das jetzt wundern?
Vermutlich steckt der Teufel im Detail und soweit reicht mein Wissen nicht...
Verfasst: Mittwoch 4. April 2007, 14:13
von Y0Gi
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.