Что полезного есть в functools — lru_cache, cache, partial, singledispatch?
- Как закэшировать результат функции в 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 — по типу
Разбор темы
- Функции — аргументы, области видимости, замыкания и декораторы
Как передаются аргументы, *args и **kwargs, LEGB, ловушка изменяемого значения по умолчанию, замыкания и позднее связывание, декораторы и functools.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.