Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1415:beispiel_zur_untersuchung_der_laufzeit

Laufzeit messen

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:

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

Wir könnten nun, wenn wir eine Funktion

def f(n):
	s=0
	for i in range(n):
		s+=i
	return s

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:

>>>g=timeit(f)
>>>print g(1000000)
#####################
'f' ((1000000,), {}) 0.06306 sec
#####################
499999500000

Eleganter geht es aber so:

@timeit
def f(n):
	s=0
	for i in range(n):
		s+=i
	return s

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.txt · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)