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

Zeit von funktionen stoppen

Beitragvon Basti91 » Mittwoch 28. Januar 2009, 12:24

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

Beitragvon Darii » Mittwoch 28. Januar 2009, 12:30

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

Re: Zeit von funktionen stoppen

Beitragvon numerix » Mittwoch 28. Januar 2009, 13:31

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

Beitragvon Basti91 » Donnerstag 29. Januar 2009, 18:39

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

Beitragvon numerix » Donnerstag 29. Januar 2009, 18:43

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

Beitragvon Basti91 » Donnerstag 29. Januar 2009, 18:48

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

Beitragvon numerix » Donnerstag 29. Januar 2009, 18:59

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

Beitragvon Basti91 » Donnerstag 29. Januar 2009, 19:06

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 29. Januar 2009, 19:20

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

Beitragvon numerix » Donnerstag 29. Januar 2009, 19:30

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

Beitragvon Basti91 » Donnerstag 29. Januar 2009, 20:00

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

Beitragvon numerix » Donnerstag 29. Januar 2009, 20:06

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

Beitragvon Basti91 » Donnerstag 29. Januar 2009, 20:09

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

Beitragvon Leonidas » Donnerstag 29. Januar 2009, 20:11

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

Beitragvon Basti91 » Donnerstag 29. Januar 2009, 20:17

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.





Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder