Вопрос с собеседования · Python

Что полезного есть в 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

Подробно

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.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗lru_cache кэширует вызовы с любыми аргументами, включая списки и словари, без ограничений
  • ✗partial откладывает вызов функции и потом выполняет его в отдельном фоновом потоке
  • ✗lru_cache на методе никак не влияет на время жизни объектов, на которых он вызван
  • ✓lru_cache — мемоизация, partial фиксирует аргументы, singledispatch — по типу

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования