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
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Der Code:

Code: Alles auswählen

>>> def lol(x):
...     st = time.time()
...     i = 0
...     z = 0
...     while i < x:
...         i+=1
...         z+=2*2*2*2
...     et = time.time()
...     #print "Z: ",z
...     #print "I: ",i
...     print "Runtime: %s"%(et-st)
Die Zeit:

2.4.4c1

Code: Alles auswählen

>>> lol(1000000)
Runtime: 0.670638799667
>>> lol(1000000)
Runtime: 0.665006160736
>>> lol(1000000)
Runtime: 0.6014149189
>>> lol(1000000)
Runtime: 0.661872148514
>>> lol(1000000)
Runtime: 0.647384881973
>>> 
2.5

Code: Alles auswählen

>>> lol(1000000)
Runtime: 0.43562412262
>>> lol(1000000)
Runtime: 0.438977003098
>>> lol(1000000)
Runtime: 0.433445215225
>>> lol(1000000)
Runtime: 0.414832115173
>>> lol(1000000)
Runtime: 0.437886953354
>>> 

Ich habe zwar nicht das timeit modul genutzt. Aber ergebn sich bei euch auch solche extreme Werte? Habt ihr auch schon solche Test gemacht? Kennt ihr Seiten? Ich konnte so direkt nichts dazu finden.

Daten:
Intel Centino @ 1,7GHz
Ubuntu 6.10

Habe leider kein 2.3.5 drauf gabs von 2.3.5 auch 2.4 auch mehr speed?
Weil bei den Werten würde sich ein umstieg bei meinen Programmen von 2.3.5 auf 2.5 bezahlt machen.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Ich vermute, dass das (zum Teil zumindest) am Constant Folding von 2.5 liegt. Die "2*2*2*2" werden da gleich zu einer "16" zusammengefasst.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Und genau damit wollte ich es dem Compiler schwerer machen ;-)
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ich habe jetzt kein Python 2.5 zum Testen hier, aber der Unterschied mit 16 und 2*2*2*2 ist gewaltig (Okay vlt. nicht so gewaltig außer bei einer großen Schleifendurchgangszahl wie 1000000):

>>> lol(1000000)
0.181025981903
>>> lol(1000000)
0.357705116272

Ich glaub ich brauch nicht sagen welches mit 16 war:)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Code: Alles auswählen

Runtime: 0.00224184989929
...ich liebe psyco :D[/code]
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

morgen,
hier der vergleich mit profile.

Code: Alles auswählen

#import cProfile # ab 2.5 
import profile
def runTest(x):
	i = 0
	z = 0
	while i < x:
		i += 1
		z += 2*2*2*2
	
profile.run('runTest(1000000)')

Code: Alles auswählen

#>C:\python25\pythonw -u "100_Python_Test.py"
         4 function calls in 0.273 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.269    0.269    0.269    0.269 100_Python_Test.py:4(runTest)
        1    0.004    0.004    0.004    0.004 :0(setprofile)
        1    0.000    0.000    0.269    0.269 <string>:1(<module>)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.273    0.273 profile:0(runTest(1000000))
test mit python 2.4

Code: Alles auswählen

#>C:\python24\pythonw -u "100_Python_Test.py"
         4 function calls in 0.581 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.569    0.569    0.569    0.569 100_Python_Test.py:4(runTest)
        1    0.012    0.012    0.012    0.012 :0(setprofile)
        1    0.000    0.000    0.569    0.569 <string>:1(?)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.581    0.581 profile:0(runTest(1000000))

getestet unter:
Scite ( keine console )
WinXp
2.5 GhZ Intel
768 Ram
Service-Pack 2
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Mal ne Frage:

dieses "Python psyco" ist doch nur ein compiler, richtig? Wird der offiziel bei installierten Linux Distris mitgeliefert oder muss man den nachträglich installieren?

Gruß vom fragenden Helex
BlackJack

Psyco ist ein JIT-Compiler für CPython auf x86-Architekturen. Bei Ubuntu gibt's den als Paket.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ist Python (bei XP mit dem Intel C Compiler) schneller als der GCC bei Linux?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Gerüchteweise optimiert der MS-Compiler Python etwas besser als GCC, und Intel ist besser als beiden.

Gerüchteweise.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
encbladexp
User
Beiträge: 61
Registriert: Freitag 7. März 2003, 19:28
Kontaktdaten:

Hiermal die Ergebnisse vom 1. Post auf einem Athlon 1800+ mit 512 MByte RAM in Python 2.4.3 (kein Psyco) unter Ubuntu Linux 6.06 LTS.

Code: Alles auswählen

>>> lol(1000000)
Runtime: 0.735286951065
>>> lol(1000000)
Runtime: 0.733017921448
>>> lol(1000000)
Runtime: 0.734447002411
>>> lol(1000000)
Runtime: 0.734914064407
>>> lol(1000000)
Runtime: 0.735508918762
>>> lol(1000000)
Runtime: 0.733287096024
mfg Betz Stefan
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Hi,

Code: Alles auswählen

>>> lol(1000000)
Runtime: 0.21799993515
>>> lol(1000000)
Runtime: 0.218999862671
>>> lol(1000000)
Runtime: 0.219000101089
>>> lol(1000000)
Runtime: 0.21799993515
>>> lol(1000000)
Runtime: 0.21799993515
>>> lol(1000000)
Runtime: 0.21799993515
>>> lol(1000000)
Runtime: 0.219000101089
>>> lol(1000000)
Runtime: 0.219000101089
Ich hab einen 3.2 Ghz Intel CPU, 1.5 GB RAM mit Python 2.5 unter Windows XP (Ja, ich weiß ... :wink: )

Code: Alles auswählen

>>> lol(1000000)
Runtime: 0.483999967575
>>> lol(1000000)
Runtime: 0.469000101089
>>> lol(1000000)
Runtime: 0.484999895096
>>> lol(1000000)
Runtime: 0.469000101089
>>> lol(1000000)
Runtime: 0.469000101089
>>> lol(1000000)
Runtime: 0.483999967575
>>> lol(1000000)
Runtime: 0.483999967575
>>> lol(1000000)
Runtime: 0.469000101089
Hier das ganze nochmal mit Python 2.4, selbes System.


MfG,
Craven
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Helex hat geschrieben:Mal ne Frage:

dieses "Python psyco" ist doch nur ein compiler, richtig? Wird der offiziel bei installierten Linux Distris mitgeliefert oder muss man den nachträglich installieren?

Gruß vom fragenden Helex
Also eix sagt, schau auf http://psyco.sourceforge.net/ ...ansonsten sagt es aber auch: Falls es nicht standardmaessig installiert ist (wie unter Gentoo zB), dann macht dir dein Paketmanager damit keine Sorgen...

Ansonsten kannst du es aber auch ganz einfach ausprobieren. Direkt in der psyco-Dokumentation steht dieses Beispiel:

Code: Alles auswählen

    try:
        import psyco
        psyco.full()
    except ImportError:
        print 'Psyco not installed, the program will just run slower'
EDIT: Hiermit entschuldige ich mich fuer die miese Formulierung (zweimal "ansonsten" -.-)...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich wusste garnicht das das so einfach geht mit Psyco.

Wird Attraktiv für mich.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Sr4l hat geschrieben:Ich wusste garnicht das das so einfach geht mit Psyco.

Wird Attraktiv für mich.
Ja, dass macht es auch so schoen fuer mich. Vielleicht gibt es auch Nachteile, die man auf den ersten Blick nicht sieht... aber im Moment kenne ich diese nicht.

Ansonsten verwende ich es eigentlich immer... vorallem in arithmetiklastigen Anwendungen.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
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