Depois de jogar com o timeit
módulo, não gosto da sua interface, que não é tão elegante em comparação com os dois métodos a seguir.
O código a seguir está no Python 3.
O método decorador
Isso é quase o mesmo com o método @ Mike. Aqui eu adiciono kwargs
e functools
envolvo para torná-lo melhor.
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)
O método do gerenciador 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 exemplo, você pode usá-lo como:
with timeit_context('My profiling code'):
mike = Person()
mike.think()
E o código dentro do with
bloco será cronometrado.
Conclusão
Usando o primeiro método, você pode comentar com facilidade o decorador para obter o código normal. No entanto, só pode cronometrar uma função. Se você tem alguma parte do código que não faz o que a torna uma função, pode escolher o segundo método.
Por exemplo, agora você tem
images = get_images()
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Agora você quer cronometrar a bigImage = ...
linha. Se você mudar para uma função, será:
images = get_images()
bitImage = None
@timeit
def foobar():
nonlocal bigImage
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)
Não parece tão bom ... E se você estiver no Python 2, que não tem nonlocal
palavra-chave.
Em vez disso, o uso do segundo método se encaixa aqui muito bem:
images = get_images()
with timeit_context('foobar'):
bigImage = ImagePacker.pack(images, width=4096)
drawer.draw(bigImage)