Получить доступ

Что полезного есть в functools — lru_cache, cache, partial, singledispatch?

MiddleФункции
Ещё спрашивают так:
  • Как закэшировать результат функции в Python?
Коротко

lru_cache(maxsize) — мемоизация с вытеснением давно неиспользуемых; cache (3.9) — без ограничения. Аргументы должны быть хешируемыми. partial — зафиксировать часть аргументов. singledispatch — перегрузка по типу первого аргумента. cached_property — вычислить атрибут один раз. reduce — свёртка.

  • lru_cache на методе держит ссылку на self — объекты не освобождаются
  • cache_info() и cache_clear() — статистика и сброс
  • Кэш не потокобезопасен в смысле одновременного вычисления одного ключа

А ещё Для кэша с TTL — cachetools или Redis

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

lru_cache хранит словарь «аргументы → результат» и двусвязный список порядка использования. Ключ строится из позиционных и именованных аргументов, поэтому f(1, b=2) и f(1, 2) — разные записи.

Ловушка с методами. @lru_cache на методе экземпляра включает self в ключ: кэш живёт на уровне класса и удерживает все экземпляры — утечка памяти. Решения: cached_property для атрибута, кэш в экземпляре, кэш на функции уровня модуля.

partial удобен для колбэков и map: map(partial(round, ndigits=2), values).

singledispatch выбирает реализацию по типу первого аргумента; для методов — singledispatchmethod.

Пример

from functools import lru_cache, partial, singledispatch

@lru_cache(maxsize=1024)
def fib(n): return n if n < 2 else fib(n - 1) + fib(n - 2)

parse_int = partial(int, base=16)

@singledispatch
def render(x): return str(x)
@render.register
def _(x: list): return ", ".join(map(render, x))

Что хотят услышать

  • lru_cache и требования к аргументам.
  • Ловушка с методами.
  • partial, singledispatch, cached_property.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем