Seite 1 von 1

Python 2.5 30% schneller als 2.4?

Verfasst: Sonntag 25. März 2007, 15:07
von Sr4l
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.

Verfasst: Sonntag 25. März 2007, 15:14
von birkenfeld
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.

Verfasst: Sonntag 25. März 2007, 15:20
von Sr4l
Und genau damit wollte ich es dem Compiler schwerer machen ;-)

Verfasst: Sonntag 25. März 2007, 15:50
von apollo13
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:)

Verfasst: Montag 26. März 2007, 00:48
von nkoehring

Code: Alles auswählen

Runtime: 0.00224184989929
...ich liebe psyco :D[/code]

Verfasst: Montag 26. März 2007, 07:51
von pyStyler
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

Verfasst: Montag 26. März 2007, 11:31
von Helex
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

Verfasst: Montag 26. März 2007, 12:05
von BlackJack
Psyco ist ein JIT-Compiler für CPython auf x86-Architekturen. Bei Ubuntu gibt's den als Paket.

Verfasst: Montag 26. März 2007, 13:08
von Sr4l
Ist Python (bei XP mit dem Intel C Compiler) schneller als der GCC bei Linux?

Verfasst: Montag 26. März 2007, 19:21
von birkenfeld
Gerüchteweise optimiert der MS-Compiler Python etwas besser als GCC, und Intel ist besser als beiden.

Gerüchteweise.

Verfasst: Montag 26. März 2007, 19:45
von encbladexp
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

Verfasst: Montag 26. März 2007, 20:30
von Craven
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

Verfasst: Dienstag 27. März 2007, 09:52
von nkoehring
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" -.-)...

Verfasst: Dienstag 27. März 2007, 15:48
von Sr4l
Ich wusste garnicht das das so einfach geht mit Psyco.

Wird Attraktiv für mich.

Verfasst: Dienstag 27. März 2007, 15:59
von nkoehring
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.

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
8)

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? :D

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.