Profiling Simples em Python: Medindo Performance com Decoradores Reutilizáveis
Profiling Simples em Python: Medindo Performance com Decoradores Reutilizáveis
Medir o tempo de execução de funções é essencial para identificar gargalos de performance e otimizar rotinas em aplicações Python. Ao criar um decorador reutilizável (
@medir_tempo), você consegue monitorar o tempo gasto por qualquer função do projeto sem precisar poluir o código original com chamadas manuais de cronômetro.Python
import time
from functools import wraps
def medir_tempo(func):
@wraps(func)
def wrapper(*args, **kwargs):
inicio = time.perf_counter() # Registra o tempo inicial com alta precisão
resultado = func(*args, **kwargs) # Executa a função decorada
fim = time.perf_counter() # Registra o tempo final
tempo_decorrido = fim - inicio
print(f"[PERFORMANCE] A função '{func.__name__}' levou {tempo_decorrido:.6f} segundos para executar.")
return resultado # Retorna o resultado original da função
return wrapper
# Exemplo prático de uso
if __name__ == "__main__":
@medir_tempo
def processar_dados(limite: int):
# Simula um processamento pesado
return sum(i ** 2 for i in range(limite))
# Chamada normal da função decorada
resultado_calculo = processar_dados(10_000_000)
print(f"Resultado do cálculo: {resultado_calculo}")
Pontos-chave
- Preservação de Metadados (
@wraps): O uso do decorador@wraps(func)da bibliotecafunctoolsé fundamental para preservar o nome (__name__), a docstring e a assinatura originais da função decorada. - Uso de
time.perf_counter(): Prefiratime.perf_counter()em vez detime.time(), pois ele utiliza o relógio de mais alta resolução disponível no sistema operacional para medir intervalos curtos de tempo. - Flexibilidade com
*argse**kwargs: Definir a função internawrapper(*args, **kwargs)permite que o decorador seja aplicado a qualquer função, independentemente do número ou tipo de argumentos recebidos. - Retorno Transparente: O decorador armazena a saída da função original na variável
resultadoe a retorna explicitamente no final dowrapper, garantindo que o comportamento original da aplicação não seja alterado.

Comentários
Postar um comentário