====== 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