image

Access unlimited bootcamps and 650+ courses

50
%OFF
Article image
Dener Fonseca
Dener Fonseca26/05/2025 17:38
Share
WEX - End to End EngineeringRecommended for youWEX - End to End Engineering

A Magia do Cache em Python: Desvendando functools.cache e Seus Segredos

    Introdução

    Se você já escreveu uma função custosa como uma chamada de API, uma busca em banco de dados ou um cálculo matemático complexo, provavelmente desejou que os resultados fossem reaproveitados sem precisar repetir o esforço. Python resolve isso com elegância através do módulo functools, e entre seus recursos mais poderosos e pouco explorados estão os decoradores @cache, @lru_cache e @cached_property. Este artigo explora esses recursos com exemplos práticos e mostra como eles podem melhorar significativamente o desempenho e a clareza do seu código.

    functools.cache

    A partir do Python 3.9, o decorador @cache permite armazenar em memória os resultados de funções puras, ou seja, funções que sempre retornam o mesmo resultado para os mesmos argumentos e não têm efeitos colaterais. Isso evita cálculos repetidos e acelera drasticamente a execução em chamadas futuras.

    Exemplo prático

    image

    Sem o uso de cache, essa função teria desempenho exponencial e se tornaria inutilizável para valores altos de n. Com cache, até chamadas como fibonacci(1000) tornam-se viáveis.

    functools.lru_cache

    Se sua função recebe muitos argumentos diferentes e você quer limitar a memória usada, o decorador @lru_cache permite definir um limite de armazenamento. A sigla LRU significa Least Recently Used, e isso significa que apenas os N resultados mais usados recentemente são mantidos em cache.

    Exemplo prático

    image

    Na segunda chamada com a mesma consulta, o resultado vem direto da memória sem executar a lógica interna. Se necessário, é possível limpar o cache com get_data_from_db.cache_clear().

    functools.cached_property

    Esse decorador transforma um método de instância em uma propriedade que é calculada apenas uma vez e armazenada. É muito útil para atributos derivados de outros valores do objeto que não mudam com o tempo, como um preço final baseado em preço base e imposto.

    Exemplo prático

    image

    A primeira chamada executa o cálculo. A segunda reaproveita o valor armazenado.

    Considerações importantes

    Esses decoradores devem ser usados com funções puras que não dependem de estados externos ou efeitos colaterais. Evite aplicá-los a funções que recebem argumentos mutáveis como listas ou dicionários. Para medir os ganhos reais de desempenho, você pode usar o módulo timeit. E o melhor de tudo é que essas otimizações são aplicadas com uma única linha de código, sem reescrever algoritmos inteiros.

    Conclusão

    Os decoradores @cache, @lru_cache e @cached_property representam uma forma elegante e eficiente de aplicar caching em Python. Apesar de serem recursos nativos da linguagem, muitos desenvolvedores ainda não exploram todo o seu potencial. Compreendê-los e aplicá-los corretamente pode eliminar gargalos de performance, reduzir o consumo de recursos e tornar o código mais limpo e previsível.

    Share
    Recommended for you
    TONNIE - Java and AI in Europe
    WEX - End to End Engineering
    Microsoft 50 Anos - Prompts Inteligentes
    Comments (1)
    DIO Community
    DIO Community - 27/05/2025 11:42

    Excelente, Dener! Seu artigo desvenda a magia do cache em Python de forma clara e prática, mostrando o poder de functools.cache, lru_cache e cached_property. É incrível como esses decoradores podem otimizar o desempenho do código, um verdadeiro segredo que muitos desenvolvedores ainda não exploram totalmente.

    Na DIO, valorizamos a eficiência e a otimização de performance. Seu artigo contribui diretamente para a nossa missão de capacitar profissionais com conhecimentos avançados e práticos, que impactam diretamente a qualidade e a escalabilidade das soluções que criam. É a inteligência de dados aplicada ao código!

    Considerando a importância da otimização, qual você diria que é o cenário mais comum em que um desenvolvedor Python, mesmo experiente, negligencia o uso desses recursos de cache?

    Recommended for youWEX - End to End Engineering