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 biblioteca functools é fundamental para preservar o nome (__name__), a docstring e a assinatura originais da função decorada.

  • Uso de time.perf_counter(): Prefira time.perf_counter() em vez de time.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 *args e **kwargs: Definir a função interna wrapper(*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 resultado e a retorna explicitamente no final do wrapper, garantindo que o comportamento original da aplicação não seja alterado.

Comentários

Postagens mais visitadas deste blog

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Python para Computação Quântica: Introdução com Qiskit

C# e Banco de Dados: Como Conectar e Realizar Operações com SQL Server