Eu quero criar uma função python para testar o tempo gasto em cada função e imprimir seu nome com o tempo, como posso imprimir o nome da função e se houver outra maneira de fazê-lo, por favor, diga-me
def measureTime(a):
start = time.clock()
a()
elapsed = time.clock()
elapsed = elapsed - start
print "Time spent in (function name) is: ", elapsed
timeit
para a medição. Não é perfeito, mas supera de longe a facada e é muito mais fácil de usartimeit
do que preparar algo melhor para si mesmo.Respostas:
Em primeiro lugar, sugiro o uso de um criador de perfil ou, pelo menos, use timeit .
No entanto, se você quiser escrever seu próprio método de tempo estritamente para aprender, aqui está um lugar para começar a usar um decorador.
Python 2:
E o uso é muito simples, basta usar o decorador @timing:
Python 3:
Note que estou ligando
f.func_name
para obter o nome da função como uma string (no Python 2) ouf.__name__
no Python 3.fonte
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
efunctools
envolvo para torná-lo melhor.O método do gerenciador de contexto
Por exemplo, você pode usá-lo como:
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
Agora você quer cronometrar a
bigImage = ...
linha. Se você mudar para uma função, será: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:
fonte
timeit
interface e usar awraps()
função dofunctools
módulo. Quero dizer, todo esse código extra não é necessário.import functools
Não vejo qual é o problema com o
timeit
módulo. Esta é provavelmente a maneira mais simples de fazer isso.Também é possível enviar argumentos para as funções. Tudo que você precisa é encerrar sua função usando decoradores. Mais explicações aqui: http://www.pythoncentral.io/time-a-python-function/
O único caso em que você pode estar interessado em escrever suas próprias instruções de tempo é se você deseja executar uma função apenas uma vez e também deseja obter seu valor de retorno.
A vantagem de usar o
timeit
módulo é que ele permite repetir o número de execuções. Isso pode ser necessário porque outros processos podem interferir na sua precisão de tempo. Portanto, você deve executá-lo várias vezes e observar o valor mais baixo.fonte
timeit.timeit(lambda: func(a,b,c), number=1)
? Eu uso isso ao fazer testes em uma solução hipotética em um terminal.O Timeit possui duas grandes falhas: não retorna o valor de retorno da função e usa eval, o que requer a passagem de um código de configuração extra para importações. Isso resolve os problemas de maneira simples e elegante:
fonte
Existe uma ferramenta fácil para cronometrar. https://github.com/RalphMao/PyTimer
Pode funcionar como um decorador :
Resultado:
Também pode funcionar como um timer de plug-in com controle de namespace (útil se você estiver inserindo-o em uma função que possui muitos códigos e pode ser chamada em qualquer outro lugar).
Resultado:
Espero que ajude
fonte
Método Decorator usando a biblioteca Python do decorador:
Veja post no meu blog:
publicar no blog mobilepro.pl
minha postagem no Google Plus
fonte
Minha maneira de fazer isso:
Defina uma variável como
start = time()
antes, execute a função / loops eprintTime(start)
logo após o bloco.e você conseguiu a resposta.
fonte