Después de jugar con el timeit
módulo, no me gusta su interfaz, que no es tan elegante en comparación con los dos métodos siguientes.
El siguiente código está en Python 3.
El método decorador
Esto es casi lo mismo con el método de @ Mike. Aquí agrego kwargs
y functools
envuelvo para hacerlo mejor.
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)
El método del administrador de contexto
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)))
Por ejemplo, puedes usarlo como:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
Y el código dentro del with
bloque será cronometrado.
Conclusión
Usando el primer método, puede comentar fácilmente el decorador para obtener el código normal. Sin embargo, solo puede cronometrar una función. Si tiene alguna parte del código que no sabe qué hacer para que sea una función, puede elegir el segundo método.
Por ejemplo, ahora tienes
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Ahora quieres cronometrar la bigImage = ...
línea. Si lo cambia a una función, será:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
No se ve tan bien ... ¿Qué pasa si estás en Python 2, que no tiene nonlocal
palabra clave?
En cambio, usar el segundo método encaja muy bien aquí:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)