Seite 1 von 1

Zeit von funktionen stoppen

Verfasst: Mittwoch 28. Januar 2009, 12:24
von Basti91
Hi ich möchte die Zeit stoppen die Python für 2 Sortierfunktionen braucht, und diese später vergleichen. Weiss jemand wie ich die Zeit Stoppe die eine Funktion zur ausführung benötigt?

Verfasst: Mittwoch 28. Januar 2009, 12:30
von Darii
Wenn du es dir einfach machen willst nimmst du iPython und benutzt die dort eingebaute %timeit-Funktion. Die greift auf das timeit-Modul zurück

Code: Alles auswählen

In [36]: def foo(): pass
   ....: 

In [37]: %timeit foo()
1000000 loops, best of 3: 215 ns per loop

In [38]: 

Re: Zeit von funktionen stoppen

Verfasst: Mittwoch 28. Januar 2009, 13:31
von numerix
Basti91 hat geschrieben:Hi ich möchte die Zeit stoppen die Python für 2 Sortierfunktionen braucht, und diese später vergleichen. Weiss jemand wie ich die Zeit Stoppe die eine Funktion zur ausführung benötigt?
Du könntest evtl. das timeit-Modul verwenden oder profile bzw. cProfile. Oder es via time.time() bzw. (auf Windows-Systemen) mit time.clock() machen.

Verfasst: Donnerstag 29. Januar 2009, 18:39
von Basti91
habs mit time.clock() gemacht nur hab mal ne frage : in welcher zeiteinheit rechnet den time.clock()?
hier mal mein Quelltext, das Programm soll vergleichen welche Art der Sortierung schneller ist.

Code: Alles auswählen

import time
print "***Zeitmessung von Sortierfunktionen***"
print "Zunächst wird die normale Sortierfunktion gestartet."
go = raw_input("Bitte drücken sie (S)tart: ")
Liste= input("Bitte Liste eingeben: ")
if go == "s" or go =="S":
    def sortieren3(Liste):
        start= time.clock()
        ausgabe =[]
        while len(Liste)!=0:
            Min = 0
            for i in range(1,len(Liste)):
                if Liste[Min]>=Liste[i]:
                    Min=i
            ausgabe +=[Liste[Min]]
            neueListe=[]
            for n in range(0,len(Liste)):
                if n != Min:
                    neueListe+=[Liste[n]]
            Liste= neueListe
        ende = time.clock()
        zeit1 = ende
        rückgabe = [ausgabe,zeit1]
        return rückgabe
    print sortieren3(Liste)[0]

print "Nun wird die bubblesort-Funktion gestartet."
go = raw_input("Bitte drücken sie (S)tart: ")
if go == "s" or go =="S":
    def bubblesort(Liste):
        start= time.clock()
        anzahl = len(Liste)
        vertauscht = 1
        while vertauscht:
            vertauscht = 0
            for index in range(0,anzahl-1,1):
                if Liste[index] > Liste[index+1]:
                    hilf = Liste[index]
                    Liste[index]=Liste[index+1]
                    Liste[index+1]=hilf
                    vertauscht = 1
        ende = time.clock()
        zeit2 = ende
        rückgabe2 = [Liste,zeit2]
        return rückgabe2
    print bubblesort(Liste)[0]
    
    

print "Die normale Sortierfunktion benötigt",sortieren3(Liste)[1],"sec. , die bubblesort-Funktion benötigt",bubblesort(Liste)[1],"sec. ."


Verfasst: Donnerstag 29. Januar 2009, 18:43
von numerix
Basti91 hat geschrieben:habs mit time.clock() gemacht nur hab mal ne frage : in welcher zeiteinheit rechnet den time.clock()?
Das ist eine Art von Frage, die man sich selbst in wenigen Sekunden mit Hilfe der Dokumentation von Python beantworten kann.
Versuch's doch mal ... :wink:

Verfasst: Donnerstag 29. Januar 2009, 18:48
von Basti91
clock( )

On Unix, return the current processor time as a floating point number expressed in seconds. The precision, and in fact the very definition of the meaning of ``processor time'', depends on that of the C function of the same name, but in any case, this is the function to use for benchmarking Python or timing algorithms.
On Windows, this function returns wall-clock seconds elapsed since the first call to this function, as a floating point number, based on the Win32 function QueryPerformanceCounter(). The resolution is typically better than one microsecond.
Hab das hier gefunden und wie rechne ich das ganze jetzt z.B in Sekunden um?

Verfasst: Donnerstag 29. Januar 2009, 18:59
von numerix
Basti91 hat geschrieben:
clock( )
On Unix, return the current processor time as a floating point number expressed in seconds.
Hab das hier gefunden und wie rechne ich das ganze jetzt z.B in Sekunden um?
Sind doch schon Sekunden!

Verfasst: Donnerstag 29. Januar 2009, 19:06
von Basti91
Das kommt mir aber komsich vor da wenn ich z.B die Liste [8,5,3,2,4,1,5554654,233,56,223,2,5,8] eingebe ich folgendes ergebnis bekomme:

Code: Alles auswählen

Die normale Sortierfunktion benötigt 39.2733705426 sec. , die bubblesort-Funktion benötigt 39.2751604181 sec. .
und 39 sec erscheinen mir ein bisschen arg lang.

Verfasst: Donnerstag 29. Januar 2009, 19:20
von Leonidas
Also eigentlich würde man für Code-Benchmarks ``timeit`` verwenden, weil das automatisch den exakteren Zeitgeber der auf der Platform verfügbar ist nimmt und eine entsprechende Anzahl Wiederholungen fährt, so dass eventuelle Ausreisser ausgeglichen werden.

Verfasst: Donnerstag 29. Januar 2009, 19:30
von numerix
Basti91 hat geschrieben:Das kommt mir aber komsich vor da wenn ich z.B die Liste [8,5,3,2,4,1,5554654,233,56,223,2,5,8] eingebe ich folgendes ergebnis bekomme:

Code: Alles auswählen

Die normale Sortierfunktion benötigt 39.2733705426 sec. , die bubblesort-Funktion benötigt 39.2751604181 sec. .
und 39 sec erscheinen mir ein bisschen arg lang.
Das liegt daran, dass du clock() falsch einsetzt. Du musst die Zeitdifferenz bilden, nicht einfach den aktuellen Wert von clock() abrufen und ausgeben.

Verfasst: Donnerstag 29. Januar 2009, 20:00
von Basti91
Ah ich glaub ich hab den fehler hab jetzt die differnet von start und ende gebildet und dann kommt was im hexadezimalsystem raus. wie kann ich das denn ins dezimalsystem umrechnen?

Verfasst: Donnerstag 29. Januar 2009, 20:06
von numerix
Basti91 hat geschrieben:Ah ich glaub ich hab den fehler hab jetzt die differnet von start und ende gebildet und dann kommt was im hexadezimalsystem raus.
Nein.

Verfasst: Donnerstag 29. Januar 2009, 20:09
von Basti91
ok und wie bekomm ich diese zahl nun in ein gängiges zahlensystem bin im mom völlig ratlos :?:

Verfasst: Donnerstag 29. Januar 2009, 20:11
von Leonidas
Ein Integer ist ein Integer und wie du den dann darstellst ist deine Sache. Es kommt aber in Python eigentlich nie eine hexadezimale Darstellung einer Zahl raus, wenn du nicht danach gefragt hast. Ohne Code ist aber schwer zu sagen was dein Fehler ist.

Anyway: ...use timeit, Luke...

Btw: Hexadezimal ist durchaus gängig. Frag einen Informatiker in deiner Nähe :)

Verfasst: Donnerstag 29. Januar 2009, 20:17
von Basti91

Code: Alles auswählen

import time
print "***Zeitmessung von Sortierfunktionen***"
print "Zunächst wird die normale Sortierfunktion gestartet."
go = raw_input("Bitte drücken sie (S)tart: ")
Liste= input("Bitte Liste eingeben: ")
if go == "s" or go =="S":
    def sortieren3(Liste):
        start= time.clock()
        ausgabe =[]
        while len(Liste)!=0:
            Min = 0
            for i in range(1,len(Liste)):
                if Liste[Min]>=Liste[i]:
                    Min=i
            ausgabe +=[Liste[Min]]
            neueListe=[]
            for n in range(0,len(Liste)):
                if n != Min:
                    neueListe+=[Liste[n]]
            Liste= neueListe
        ende = time.clock()
        zeit1 = ende-start
        rückgabe = [ausgabe,zeit1]
        return rückgabe
    print sortieren3(Liste)[0]

print "Nun wird die bubblesort-Funktion gestartet."
go = raw_input("Bitte drücken sie (S)tart: ")
if go == "s" or go =="S":
    def bubblesort(Liste):
        start= time.clock()
        anzahl = len(Liste)
        vertauscht = 1
        while vertauscht:
            vertauscht = 0
            for index in range(0,anzahl-1,1):
                if Liste[index] > Liste[index+1]:
                    hilf = Liste[index]
                    Liste[index]=Liste[index+1]
                    Liste[index+1]=hilf
                    vertauscht = 1
        ende = time.clock()
        zeit2 = ende-start
        rückgabe2 = [Liste,zeit2]
        return rückgabe2
    print bubblesort(Liste)[0]
    
    

print "Die normale Sortierfunktion benötigt",sortieren3(Liste)[1],"sec. , die bubblesort-Funktion benötigt",bubblesort(Liste)[1],"sec. ."
Das hier ist mein Code, wenn ich aus zeit1 bzw zeit2 ne Integer also int(zahl1) mache kommt bei beiden Zahlen 0 sec raus. Und wenn ich es so laufen lassen kommen komische zahlen raus z.B bei der Liste: [45,2213,7,2,11,5,7,3,5,7,9,54,3,8].
Die normale Sortierfunktion benötigt 9.7188267727e-005 sec. , die bubblesort-Funktion benötigt 5.87880384018e-006 sec. .
Diese zwei Werte müssen also irgendetwas unter 1 sein da ich bei int(zahl) ja 0 herausbekomme. nun hätte ich die Ausgabe halt gerne so das ich dann 0,...irgendwas sec. herausbekomme.




Verfasst: Donnerstag 29. Januar 2009, 20:24
von cofi
Benutze String Formatting, um das aus der Exponentialform zu bekommen (e-005 == *10^-5)

Code: Alles auswählen

 print "%.10f" % time

Verfasst: Donnerstag 29. Januar 2009, 20:45
von Basti91
Dankeschööööön funktioniert :D

Verfasst: Donnerstag 29. Januar 2009, 20:45
von numerix
Basti91 hat geschrieben: Diese zwei Werte müssen also irgendetwas unter 1 sein da ich bei int(zahl) ja 0 herausbekomme. nun hätte ich die Ausgabe halt gerne so das ich dann 0,...irgendwas sec. herausbekomme.
http://de.wikipedia.org/wiki/Exponentialschreibweise