Pular para o conteúdo

Como Usar o Temporizador Python

CodeMDD.io

Funções de Medição de Tempo em Python: Três maneiras de monitorar seu código

Enquanto muitos desenvolvedores reconhecem o Python como uma linguagem de programação eficaz, programas em Python puro podem ser executados mais lentamente do que seus equivalentes em linguagens compiladas como C, Rust e Java. Neste tutorial, você aprenderá como usar um timer em Python para medir a velocidade de execução dos seus programas.

Python Timers

Primeiro, vamos dar uma olhada em algum código de exemplo que usaremos ao longo do tutorial. Mais tarde, adicionaremos um timer em Python a este código para monitorar seu desempenho. Também aprenderemos algumas das maneiras mais simples de medir o tempo de execução desse exemplo.

Funções de Medição de Tempo em Python

Se você verificar o módulo time integrado em Python, notará várias funções que podem medir o tempo:

  • monotonic()
  • perf_counter()
  • process_time()
  • time()

O Python 3.7 introduziu várias novas funções, como thread_time(), bem como versões em nanosegundos de todas as funções acima, nomeadas com um sufixo _ns. Por exemplo, perf_counter_ns() é a versão em nanossegundos de perf_counter().

No entanto, perf_counter() é a função de medição de tempo mais precisa e amplamente utilizada. Ela retorna o tempo em segundos como um valor de ponto flutuante e é adequada para medir pequenas durações com precisão.

Aqui está um exemplo simples que usa perf_counter() para medir o tempo que leva para o Python contar de 1 a 1 milhão:

import time
start = time.perf_counter()
for i in range(1, 1_000_001):
pass
end = time.perf_counter()
print(f"Tempo de execução: {end - start} segundos")

Nesse exemplo, usamos perf_counter() para registrar o tempo antes e depois do loop. A diferença entre os dois tempos nos fornece a duração exata do loop.

Exemplo: Baixando Tutoriais

Agora que você já sabe como usar perf_counter(), vamos ver um exemplo prático onde usaremos um timer em Python para monitorar o tempo de download de tutoriais.

import time
import requests
def download_tutorial(url: str) -> None:
start_time = time.perf_counter()
response = requests.get(url)
end_time = time.perf_counter()
duration = end_time - start_time
print(f"Download concluído em {duration:.2f} segundos")
download_tutorial("https:https://codemdd.io/www.example.comhttps://codemdd.io/tutorial.zip")

Nesse exemplo, criamos uma função download_tutorial() que recebe uma URL como argumento, usa perf_counter() para registrar o tempo de início, faz o download do arquivo e, em seguida, registra o tempo de término. A duração total do download é calculada subtraindo o tempo de início do tempo de término.

Seu primeiro Timer em Python

Agora que você entende como usar perf_counter(), pode começar a criar seu próprio timer em Python. Um timer é uma classe que mede o tempo de execução de certas partes do código.

import time
class Timer:
def __enter__(self):
self.start_time = time.perf_counter()
def __exit__(self, exc_type, exc_value, exc_tb):
end_time = time.perf_counter()
duration = end_time - self.start_time
print(f"Tempo de execução: {duration:.2f} segundos")
with Timer():
for i in range(1, 1_000_001):
pass

Neste exemplo, definimos a classe Timer que usa os métodos especiais __enter__() e __exit__() para registrar o tempo de início e o tempo de término. A duração total é calculada subtraindo o tempo de início do tempo de término. Usamos o bloco with para garantir que o tempo seja registrado corretamente, mesmo em caso de exceção.

Mais praticidade e flexibilidade

Agora que você tem um timer em Python básico, vamos torná-lo mais prático e flexível. Adicionaremos um parâmetro opcional name para que possamos nomear o timer. Também faremos com que o timer seja capaz de retornar a duração para que possamos usá-la em nosso código.

import time
class Timer:
def __init__(self, name=None):
self.name = name
self.duration = None
def __enter__(self):
self.start_time = time.perf_counter()
def __exit__(self, exc_type, exc_value, exc_tb):
end_time = time.perf_counter()
self.duration = end_time - self.start_time
if self.name:
print(f"{self.name} - Tempo de execução: {self.duration:.2f} segundos")
with Timer("Contagem"):
for i in range(1, 1_000_001):
pass
with Timer("Download"):
download_tutorial("https:https://codemdd.io/www.example.comhttps://codemdd.io/tutorial.zip")
print(f"Duração do download: {Timer('Download').duration:.2f} segundos")

Aqui, atualizamos a classe Timer para que possa receber um parâmetro opcional name no método __init__() e armazená-lo como parte do objeto. No método __exit__(), atribuímos a duração à variável self.duration. Se o timer tiver um nome, também imprimimos o nome junto com a duração.

Além disso, agora podemos acessar a duração fora do timer, conforme demonstrado no exemplo de download de tutorial.

Conclusão

Neste tutorial, você aprendeu como usar um timer em Python para monitorar o tempo de execução do seu código. Exploramos diferentes métodos, como o uso de funções de medição de tempo, classes, gerenciadores de contexto e decoradores. Cada método tem suas vantagens e você pode escolher o mais adequado para sua situação.

Aqui estão algumas lições que você pode levar:

  • Use a função perf_counter() para medir o tempo de maneira precisa e confiável.
  • As classes podem ajudar a organizar seu código e fornecer flexibilidade adicional.
  • Os gerenciadores de contexto são úteis quando você deseja garantir que determinadas ações sejam executadas antes e depois de um bloco de código.
  • Os decoradores permitem personalizar o comportamento de uma função sem modificar seu código-fonte original.

Agora você tem as ferramentas necessárias para implementar um timer em seus programas Python e monitorar seu desempenho.

Recursos