Se você deseja apenas medir o tempo decorrido do relógio de parede entre dois pontos, você pode usar time.time()
:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
Isso fornece o tempo de execução em segundos.
Outra opção desde o 3.3 pode ser usar perf_counter
ou process_time
, dependendo de seus requisitos. Antes do 3.3, era recomendado o uso time.clock
(obrigado Amber ). No entanto, atualmente está obsoleto:
No Unix, retorne o tempo atual do processador como um número de ponto flutuante expresso em segundos. A precisão e, de fato, a própria definição do significado de "tempo do processador", depende da função C de mesmo nome.
No Windows, essa função retorna os segundos do relógio de parede decorridos desde a primeira chamada para essa função, como um número de ponto flutuante, com base na função Win32 QueryPerformanceCounter()
. A resolução normalmente é melhor que um microssegundo.
Descontinuado desde a versão 3.3 : O comportamento desta função depende da plataforma: use perf_counter()
ouprocess_time()
, em vez disso , dependendo de seus requisitos, para ter um comportamento bem definido.
time.clock()
é realmente preferido, uma vez que não pode ser interferido se o relógio do sistema fica confuso com, mas.time()
não na sua maioria realizar a mesma finalidade.)print(timedelta(seconds=execution_time))
. Embora seja uma pergunta separada.Use em
timeit.default_timer
vez detimeit.timeit
. O primeiro fornece o melhor relógio disponível em sua plataforma e versão do Python automaticamente:timeit.default_timer é atribuído a time.time () ou time.clock () dependendo do sistema operacional. No Python 3.3+, default_timer é time.perf_counter () em todas as plataformas. Veja Python - precisão time.clock () vs. time.time () - precisão?
Veja também:
fonte
default_timer() measurations can be affected by other programs running on the same machine, so the best thing to do when accurate timing is necessary is to repeat the timing a few times and use the best time. The -r option is good for this; the default of 3 repetitions is probably enough in most cases. On Unix, you can use time.clock() to measure CPU time.
perf
módulo (inexistente no momento da resposta) que fornece a mesma interface, mas às vezes difere dastimeit
decisões do módulo sobre como medir o desempenho do tempo.Apenas Python 3:
Como time.clock () está obsoleto no Python 3.3 , convém usar o tempo
time.perf_counter()
para todo o sistema outime.process_time()
para todo o processo, exatamente como você costumava usartime.clock()
:A nova função
process_time
não incluirá o tempo decorrido durante o sono.fonte
timeit.default_timer
vez detime.perf_counter
. O primeiro escolherá o cronômetro apropriado para medir o desempenho do tempo ajustado para sua plataforma e versão do Python.process_time()
faz não inclui o tempo durante o sono e, portanto, não é apropriado para medir o tempo decorrido.Dada uma função que você gostaria de cronometrar,
test.py:
a maneira mais fácil de usar
timeit
é chamá-lo na linha de comando:Não tente usar
time.time
outime.clock
(ingenuamente) comparar a velocidade das funções. Eles podem dar resultados enganosos .PS. Não coloque instruções de impressão em uma função que deseja cronometrar; caso contrário, o tempo medido dependerá da velocidade do terminal .
fonte
É divertido fazer isso com um gerenciador de contexto que se lembra automaticamente da hora de início na entrada de um
with
bloco e congela a hora de término na saída do bloco. Com um pouco de truque, você pode até obter uma contagem de tempo decorrido dentro do bloco a partir da mesma função de gerenciador de contexto.A biblioteca principal não tem isso (mas provavelmente deveria). Uma vez instalado, você pode fazer coisas como:
Aqui está o código do gerenciador de contexto suficiente para executar o truque:
E algum código de demonstração executável:
Observe que, por design dessa função, o valor de retorno de
elapsed()
é congelado na saída do bloco e outras chamadas retornam a mesma duração (de cerca de 6 segundos neste exemplo de brinquedo).fonte
Tempo de medição em segundos:
Saída :
fonte
Eu prefiro isso.
timeit
doc é muito confuso.Observe que não há formatação aqui, eu apenas escrevi
hh:mm:ss
na impressão para que se possa interpretartime_elapsed
fonte
Aqui está outra maneira de fazer isso:
Comparando com a maneira tradicional:
Instalação:
Consulte a página PyPi para mais detalhes.
fonte
t.tic()
enterrado no código, cabe a mim o desenvolvedor manter uma lista mental de onde, na série, devo esperar que seja. Você se encontra montando ninhos ou apenas vários tictocs?ttictoc
. Que bagunça eu tinha, mas deve estar bom agora.Aqui estão minhas descobertas depois de passar por muitas boas respostas aqui, além de alguns outros artigos.
Primeiro, se você estiver debatendo entre
timeit
etime.time
, otimeit
tem duas vantagens:timeit
seleciona o melhor timer disponível na sua versão do SO e Python.timeit
desativa a coleta de lixo, no entanto, isso não é algo que você pode ou não querer.Agora, o problema é que
timeit
não é tão simples de usar, porque ele precisa de configuração e as coisas ficam feias quando você tem um monte de importações. Idealmente, você só quer um decorador ou usa owith
bloco e mede o tempo. Infelizmente, não há nada embutido disponível para isso, então você tem duas opções:Opção 1: usar a biblioteca de orçamento
O timebudget é uma biblioteca versátil e muito simples que você pode usar apenas em uma linha de código após a instalação do pip.
Opção 2: use o módulo de código diretamente
Criei abaixo um pequeno módulo utilitário.
Agora você pode cronometrar qualquer função colocando um decorador à sua frente:
Se você quiser cronometrar parte do código, basta colocá-lo dentro do
with
bloco:Vantagens:
Existem várias versões com suporte parcial, por isso quero destacar alguns destaques:
with utils.MeasureBlockTime() as t
e depoist.elapsed
).fonte
Usar
time.time
para medir a execução fornece o tempo total de execução de seus comandos, incluindo o tempo de execução gasto por outros processos no seu computador. É a hora em que o usuário percebe, mas não é bom se você deseja comparar diferentes trechos de código / algoritmos / funções / ...Mais informações em
timeit
:Se você deseja uma visão mais profunda da criação de perfil:
Atualização : usei muito o http://pythonhosted.org/line_profiler/ durante o último ano e achei muito útil e recomendo usá-lo em vez do módulo de perfil do Pythons.
fonte
Aqui está uma pequena classe de timer que retorna a string "hh: mm: ss":
Uso:
fonte
Os módulos python cProfile e pstats oferecem grande suporte para medir o tempo decorrido em determinadas funções sem precisar adicionar nenhum código às funções existentes.
Por exemplo, se você tiver um script python timeFunctions.py:
Para executar o criador de perfil e gerar estatísticas para o arquivo, basta executar:
O que isso está fazendo é usar o módulo cProfile para criar um perfil de todas as funções no timeFunctions.py e coletar as estatísticas no arquivo timeStats.profile. Observe que não precisamos adicionar nenhum código ao módulo existente (timeFunctions.py) e isso pode ser feito com qualquer módulo.
Depois de ter o arquivo de estatísticas, você pode executar o módulo pstats da seguinte maneira:
Isso executa o navegador de estatísticas interativas, que oferece muitas funcionalidades interessantes. Para seu caso de uso específico, você pode apenas verificar as estatísticas de sua função. No nosso exemplo, verificar estatísticas para ambas as funções mostra o seguinte:
O exemplo fictício não faz muito, mas dá uma idéia do que pode ser feito. A melhor parte dessa abordagem é que não preciso editar nenhum código existente para obter esses números e, obviamente, ajudar na criação de perfis.
fonte
python -m pstats timeStats.profile ValueError: bad marshal data (unknown type code)
verifique sua versão do python que está executando. Eu consegui isso quando corripython3 -m cProfile...
epython -m pstats
. Meu erro, mas me pegou por um segundo, então, eu queria compartilhardon't forget consistency
. =)Aqui está outro gerenciador de contexto para o código de temporização -
Uso:
ou, se você precisar do valor do tempo
benchmark.py :
Adaptado de http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html
fonte
Use o módulo profiler. Dá um perfil muito detalhado.
gera algo como:
Eu achei muito informativo.
fonte
main()
? Seria mais útil se você pudesse fornecer um exemplo de código simples.Eu gosto simples (python 3):
A saída é microssegundos para uma única execução:
Explicação : timeit executa a função anônima 1 milhão de vezes por padrão e o resultado é fornecido em segundos . Portanto, o resultado para uma única execução é a mesma quantidade, mas em microssegundos em média.
Para operações lentas , adicione um número menor de iterações ou você poderá esperar para sempre:
A saída é sempre em segundos para o número total de iterações:
fonte
(Somente com Ipython), você pode usar % timeit para medir o tempo médio de processamento:
e depois:
o resultado é algo como:
fonte
Mais uma maneira de usar o timeit :
fonte
em python3:
elegante e curto.
fonte
Uma resposta super tardia, mas talvez sirva a um propósito para alguém. Esta é uma maneira de fazê-lo, que eu acho super limpa.
Lembre-se de que "print" é uma função no Python 3 e não no Python 2.7. No entanto, ele funciona com qualquer outra função. Felicidades!
fonte
Você pode usar timeit.
Aqui está um exemplo de como testar naive_func que usa parâmetros usando o Python REPL:
Você não precisa da função wrapper se a função não tiver nenhum parâmetro.
fonte
lambda
seria mais sucinto:print(timeit.timeit(lambda: naive_func(1_000), number=1_000_000))
Também podemos converter tempo em tempo legível por humanos.
fonte
Eu criei uma biblioteca para isso, se você quiser medir uma função, você pode fazê-lo assim
https://github.com/Karlheinzniebuhr/pythonbenchmark
fonte
Para obter informações sobre todas as chamadas de função recursivamente, faça:
Ele pega essas duas linhas de código em um notebook Jupyter e gera um bom diagrama interativo. Por exemplo:
Aqui está o código. Novamente, as duas linhas que começam com
%
são as únicas linhas de código extras necessárias para usar o snakeviz:Também parece possível executar o snakeviz fora dos notebooks. Mais informações no site da snakeviz .
fonte
fonte
Essa abordagem exclusiva baseada em classe oferece uma representação de sequência imprimível, arredondamento personalizável e acesso conveniente ao tempo decorrido como uma sequência ou flutuação. Foi desenvolvido com o Python 3.7.
Uso:
fonte
Avalie o tempo de execução de pequenos trechos de código.
Docs do Python de origem !
fonte
Se você deseja programar funções de forma conveniente, pode usar um decorador simples:
Você pode usá-lo em uma função que deseja cronometrar assim:
Então, sempre que você ligar
function_to_time
, imprimirá quanto tempo levou e o nome da função que está sendo cronometrada.fonte
com base na solução contextmanager fornecida por https://stackoverflow.com/a/30024601/5095636 , abaixo da versão gratuita lambda, pois o flake8 adverte sobre o uso de lambda conforme E731 :
teste:
fonte
A maneira mais fácil de calcular a duração de uma operação:
fonte
Aqui está um decorador com dicas bastante bem documentado e completo que eu uso como um utilitário geral:
Exemplo de uso:
Os documentos podem ser verificados com:
E o tipo sugere com:
fonte
Callable[[AnyF], AnyF]
. O que isso significa?AnyF
como significandoCallable[..., Any]
, portanto,AnyF
é uma função que pode pegar qualquer quantidade de qualquer tipo de argumento e retornar qualquer coisa. EntãoCallable[[AnyF], AnyF]
iria expandir paraCallable[[Callable[..., Any]], Callable[..., Any]]
. Este é o tipo do valor de retorno detimer
aka o tipo completo dedecorator
. É uma função que aceita qualquer tipo de função como único argumento e retorna qualquer tipo de função.