Python
Кеширование результатов функции
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) # «Считаю сумму…» напечатается один раз