Python

Кеширование результатов функции

Algonexys · 07.08.2026 · 👁 0

lru_cache для чистых функций и cached_property для тяжёлых атрибутов модели.

Код

from functools import cached_property, lru_cache


@lru_cache(maxsize=1024)
def fib(n):
    """Без кеша — экспоненциальное время, с кешем — линейное."""
    return n if n < 2 else fib(n - 1) + fib(n - 2)


print(fib(100))
print(fib.cache_info())   # hits, misses, maxsize, currsize
fib.cache_clear()


class Report:
    def __init__(self, rows):
        self.rows = rows

    @cached_property
    def total(self):
        """Считается один раз при первом обращении."""
        print("Считаю сумму…")
        return sum(self.rows)


report = Report(range(1_000_000))
print(report.total, report.total)   # «Считаю сумму…» напечатается один раз