Python Programming

Dominando os Timers do Python: Um Guia para time.time(), time.process_time(), time.perf_counter(), e time.monotonic()

Spread the love

Sumário

O módulo time do Python fornece várias funções para medir o tempo decorrido, cada uma com suas próprias vantagens e desvantagens. A escolha ideal depende do aplicativo específico e do nível de precisão necessário. Este artigo esclarece as distinções entre quatro funções de temporizador principais: time.time(), time.process_time(), time.perf_counter() e time.monotonic().

Usando time.time()

time.time() retorna o tempo do sistema atual como um número de ponto flutuante representando segundos desde a época (geralmente 1º de janeiro de 1970, 00:00:00 UTC). Este é um tempo de “relógio de parede”, suscetível a alterações de ajustes do relógio do sistema (por exemplo, sincronização NTP). Consequentemente, não é adequado para medições de tempo precisas.


import time

start_time = time.time()
# ... algum código para ser cronometrado ...
end_time = time.time()
elapsed_time = end_time - start_time
print(f"Tempo decorrido: {elapsed_time:.4f} segundos")
  

Use time.time() para aplicativos que exigem apenas uma estimativa aproximada do tempo decorrido, como registrar os horários de início e fim de um processo.

Usando time.process_time()

time.process_time() mede a soma do tempo de CPU do sistema e do usuário do processo atual, excluindo o tempo gasto dormindo ou esperando por E/S. É ideal para benchmarking de operações limitadas pela CPU, fornecendo uma medida confiável do tempo de CPU consumido. Não é afetado por alterações no relógio do sistema e não representa o tempo do relógio de parede.


import time

start_time = time.process_time()
# ... algum código limitado pela CPU ...
end_time = time.process_time()
elapsed_time = end_time - start_time
print(f"Tempo de processo decorrido: {elapsed_time:.4f} segundos")
  

Esta função é mais adequada para avaliar o esforço computacional de um programa, independentemente de fatores externos.

Usando time.perf_counter()

time.perf_counter() fornece um valor de contador de desempenho de alta resolução com a maior precisão disponível. É perfeito para benchmarking de código onde a precisão é primordial. Como time.process_time(), não é afetado por ajustes do relógio do sistema, mas, ao contrário de time.process_time(), inclui o tempo gasto dormindo ou esperando.


import time

start_time = time.perf_counter()
# ... algum código para ser cronometrado com precisão ...
end_time = time.perf_counter()
elapsed_time = end_time - start_time
print(f"Tempo do contador de desempenho decorrido: {elapsed_time:.6f} segundos")
  

Use time.perf_counter() para micro-benchmarking e aplicativos que exigem medições de tempo extremamente precisas, independentemente de alterações no relógio do sistema.

Usando time.monotonic()

time.monotonic() retorna um valor de contador monotonicamente crescente. O valor sempre aumenta e nunca diminui, mesmo com ajustes no relógio do sistema. É essencial para medir o tempo decorrido quando garantir um valor de tempo sempre crescente é crucial, independentemente de influências externas. Não está diretamente relacionado ao tempo do relógio de parede ou ao tempo da CPU.


import time

start_time = time.monotonic()
# ... algum código ...
end_time = time.monotonic()
elapsed_time = end_time - start_time
print(f"Tempo monotônico decorrido: {elapsed_time:.4f} segundos")
  

Esta função é vital em cenários em que ajustes de relógio podem levar a medições de tempo imprecisas, como loops de jogos ou barras de progresso.

Em conclusão, a seleção da função de temporizador apropriada depende inteiramente das necessidades do aplicativo específico. Para temporização geral, time.time() pode ser suficiente. Para tarefas limitadas pela CPU, time.process_time() é recomendado. Para medições de alta precisão, time.perf_counter() é ideal. Finalmente, time.monotonic() garante valores de tempo monotonicamente crescentes, crucial quando ajustes de relógio são uma preocupação.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *