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 ...
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)
Verfasst: Donnerstag 29. Januar 2009, 20:45
von Basti91
Dankeschööööön funktioniert
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