HOWTO · Python
Funções de cronômetro em Python
Este tutorial demonstra como monitorar e analisar o tempo de execução de um código Python
Nesta página
Use time.perf_counter() para a maioria das medições de duração e escolha time.process_time() quando quiser medir especificamente o tempo de CPU consumido pelo processo atual. O módulo time também oferece time.time() para obter timestamps do relógio do sistema e time.monotonic() para medir intervalos sem que ajustes no relógio do sistema os afetem. Em cada padrão de medição, registre uma leitura inicial, execute o trabalho, registre uma leitura final e subtraia a inicial da final. Os trechos abaixo são ilustrativos; as durações medidas dependem da máquina e da execução.
Medir o tempo de relógio com time.time()
time.time() retorna a hora atual do relógio do sistema em segundos desde a época Unix: 00:00:00 UTC de 1º de janeiro de 1970. Use-a quando precisar armazenar ou exibir um timestamp, ou compará-lo com outro timestamp. Como ela segue o relógio do sistema, um ajuste feito pelo sistema operacional ou pelo usuário pode alterar sua leitura. Por isso, não é a melhor opção padrão para medir intervalos curtos: um ajuste do relógio entre as duas leituras pode distorcer a subtração.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import time
start = time.time()
total = sum(range(1, 1001))
end = time.time()
print(f"sum={total}")
print(f"elapsed={end - start:.6f} seconds")
A primeira linha apresenta a soma determinística; a segunda mostra uma duração medida, que varia. Mantenha o código que está sendo medido entre as duas leituras para que a subtração cubra o trabalho pretendido.
Medir o tempo de CPU com time.process_time()
time.process_time() mede o tempo de CPU consumido pelo processo atual. Seu valor não inclui o tempo gasto dormindo ou aguardando uma entrada, uma resposta da rede ou outro processo. Use-a para estimar quanto tempo de processamento seu código consome, em vez de medir quanto tempo o usuário espera até a conclusão. Subtraia a leitura inicial da leitura final para obter a duração de CPU do trabalho executado entre elas.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import time
start = time.process_time()
total = sum(number * number for number in range(100_000))
cpu_seconds = time.process_time() - start
print(f"sum={total}; CPU time={cpu_seconds:.6f} seconds")
Se uma tarefa passa muito tempo aguardando, sua duração de CPU pode ser bem menor que seu tempo decorrido. Essa diferença é útil para distinguir processamento de espera, mas, por si só, não identifica o que o processo estava aguardando.
Medir o tempo decorrido com time.perf_counter()
time.perf_counter() é um relógio monotônico de alta resolução, destinado à medição de intervalos. Sua origem não é especificada; portanto, use a diferença entre leituras em vez de interpretar um valor isolado como data ou timestamp. Ao contrário do tempo de CPU do processo, o tempo decorrido inclui o período gasto dormindo ou aguardando. É adequada tanto para funções curtas quanto para operações mais longas; sua precisão não significa que deva ser restrita a processos pequenos.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import time
start = time.perf_counter()
time.sleep(0.1)
elapsed = time.perf_counter() - start
print(f"elapsed={elapsed:.3f} seconds")
O resultado ficará próximo da duração de espera solicitada, mas o escalonamento e a carga do sistema podem acrescentar tempo. Para fazer benchmarking, repita trabalhos comparáveis e compare as medições em condições semelhantes, em vez de tratar uma única leitura como garantia.
Medir o tempo decorrido com time.monotonic()
time.monotonic() também mede intervalos com um relógio que não retrocede devido a atualizações do relógio do sistema. Seu ponto de referência é indefinido, então somente as diferenças entre leituras têm significado. Use-a para prazos de timeout ou verificações de duração quando as alterações no relógio civil não puderem afetar o cálculo. Ela não ajusta suas leituras às mudanças externas no relógio; em vez disso, evita que essas mudanças afetem a medição do intervalo.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import time
start = time.monotonic()
time.sleep(0.1)
elapsed = time.monotonic() - start
print(f"elapsed={elapsed:.3f} seconds")
Escolha time.time() quando precisar de um timestamp Unix, time.process_time() para medir o tempo de CPU consumido pelo processo e time.perf_counter() para medições gerais de tempo decorrido. Escolha time.monotonic() quando um intervalo ou timeout precisar continuar confiável apesar de mudanças no relógio do sistema. Em todos os casos, o código entre as duas leituras define o que a duração medida abrange.