Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1415:beispiel_zur_untersuchung_der_laufzeit

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1415:beispiel_zur_untersuchung_der_laufzeit [2014/12/09 22:56]
stefanborn
ws1415:beispiel_zur_untersuchung_der_laufzeit [2016/05/10 14:46] (aktuell)
Zeile 1: Zeile 1:
 ====== Laufzeit messen ====== ====== Laufzeit messen ======
  
-Mit Hilfe des ''​time''​-Moduls könnt ihr natürlich, wo euch das interessiert,​ analysieren,​ wofür euer Programm wie lange braucht. ​ +Mit Hilfe des ''​time''​-Moduls könnt ihr natürlich, wo euch das interessiert,​ analysieren,​ wofür euer Programm wie lange braucht. ​Ihr könnte etwa die Zeit vor und nach der Ausführung eines Programmteils in einer Variable speichern und euch dann die Differenz der beiden Wert ansehen. Es ist aber auch praktisch, ohne solche Aufwand messen zu können.  
 + 
 +Eine elegante Möglichkeit verwendet so genannte **decorators**. Was das ist, versteht man am besten am Beispiel: 
 + 
 +Wir definieren zunächst eine Funktion ''​timeit'',​ die aus einer Funktion eine neue Funktion macht. Die neue Funktion liefert denselben Wert zurück wie die alte, misst aber außerdem noch die vergangene Zeit und gibt diese aus: 
 +<code python>​ 
 +import time                                                 
 + 
 +def timeit(method):​ 
 + 
 +    def timed(*args,​ **kw): 
 +        ts = time.time() 
 +        result = method(*args,​ **kw) 
 +        te = time.time() 
 +        print "#####################"​ 
 +        print '%r (%r, %r) %2.5f sec' % \ 
 +              (method.__name__,​ args, kw, te-ts) 
 +        print "#####################"​ 
 +        return result 
 + 
 +    return timed 
 +</​code>​
    
 +Wir könnten nun, wenn wir eine Funktion ​
 +<code python>
 +def f(n):
 + s=0
 + for i in range(n):
 + s+=i
 + return s
 +</​code>​
 +definiert haben, durch ''​g=timeit(f)''​ eine Funktion erhalten, die nichts anderes tut als ''​f'',​ aber außerdem die Zeit misst. ​
 +Das sieht so aus:
 +<​code>​
 +>>>​g=timeit(f)
 +>>>​print g(1000000)
 +#####################​
 +'​f'​ ((1000000,​),​ {}) 0.06306 sec
 +#####################​
 +499999500000
 +</​code>​
 +
 +Eleganter geht es aber so:
 +<code python>
 +@timeit
 +def f(n):
 + s=0
 + for i in range(n):
 + s+=i
 + return s
 +</​code>​
 +Das bedeutet genau dasselbe wie ''​f=timeit(f)'',​ ist aber gut lesbar. Man kann nun, um Fehler zu finden oder das Programm zu verbessern, vor jede Funktion oder Methode ''​@timeit''​ schreiben, wenn man die Zeit-Information möchte, und es wieder löschen, wenn man die Information nicht mehr braucht
ws1415/beispiel_zur_untersuchung_der_laufzeit.1418162186.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)