Zeit von funktionen stoppen

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
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

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?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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]: 
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

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. ."

Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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:
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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!
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

ok und wie bekomm ich diese zahl nun in ein gängiges zahlensystem bin im mom völlig ratlos :?:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :)
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

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.



Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Benutze String Formatting, um das aus der Exponentialform zu bekommen (e-005 == *10^-5)

Code: Alles auswählen

 print "%.10f" % time
Benutzeravatar
Basti91
User
Beiträge: 53
Registriert: Samstag 15. Dezember 2007, 11:50
Wohnort: Saarland

Dankeschööööön funktioniert :D
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
Antworten