Nach dem Spielen mit dem timeit
Modul gefällt mir die Benutzeroberfläche nicht, die im Vergleich zu den folgenden beiden Methoden nicht so elegant ist.
Der folgende Code befindet sich in Python 3.
Die Dekorationsmethode
Dies ist fast das gleiche mit @ Mikes Methode. Hier füge ich hinzu kwargs
und functools
wickle es ein, um es besser zu machen.
def timeit(func):
@functools.wraps(func)
def newfunc(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
elapsedTime = time.time() - startTime
print('function [{}] finished in {} ms'.format(
func.__name__, int(elapsedTime * 1000)))
return newfunc
@timeit
def foobar():
mike = Person()
mike.think(30)
Die Kontextmanager-Methode
from contextlib import contextmanager
@contextmanager
def timeit_context(name):
startTime = time.time()
yield
elapsedTime = time.time() - startTime
print('[{}] finished in {} ms'.format(name, int(elapsedTime * 1000)))
Zum Beispiel können Sie es wie folgt verwenden:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
Und der Code innerhalb des with
Blocks wird zeitlich festgelegt.
Fazit
Mit der ersten Methode können Sie den Dekorateur leicht auskommentieren, um den normalen Code zu erhalten. Es kann jedoch nur eine Funktion zeitlich festgelegt werden. Wenn Sie einen Teil des Codes haben, den Sie nicht als Funktion verwenden können, können Sie die zweite Methode auswählen.
Zum Beispiel haben Sie jetzt
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Jetzt möchten Sie die bigImage = ...
Linie zeitlich festlegen. Wenn Sie es in eine Funktion ändern, ist es:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Sieht nicht so gut aus ... Was ist, wenn Sie in Python 2 sind, das kein nonlocal
Schlüsselwort hat?
Stattdessen passt die Verwendung der zweiten Methode hier sehr gut:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)