Après avoir joué avec le timeit
module, je n'aime pas son interface, qui n'est pas si élégante comparée aux deux méthodes suivantes.
Le code suivant est en Python 3.
La méthode décoratrice
C'est presque la même chose avec la méthode de @ Mike. Ici, j'ajoute kwargs
et functools
j'emballe pour l'améliorer.
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)
La méthode du gestionnaire de contexte
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)))
Par exemple, vous pouvez l'utiliser comme:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
Et le code dans le with
bloc sera chronométré.
Conclusion
En utilisant la première méthode, vous pouvez facilement commenter le décorateur pour obtenir le code normal. Cependant, il ne peut chronométrer qu'une fonction. Si vous avez une partie de code dont vous ne savez pas quoi faire pour en faire une fonction, vous pouvez choisir la deuxième méthode.
Par exemple, maintenant vous avez
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Maintenant vous voulez chronométrer le bigImage = ...
ligne. Si vous le changez en fonction, ce sera:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Ça n'a pas l'air génial ... Et si vous êtes en Python 2, qui n'a pas de nonlocal
mot-clé.
Au lieu de cela, utiliser la deuxième méthode convient très bien ici:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)