functools.lru_cache
Декоратор для мемоизации функций.
functools.lru_cache(maxsize=128, typed=False)
-> callable
maxsize=128 -- Максимальное хранимое количество результатов (читай: размер кеша). Если установить в 'None', то размер не будет ограничен (и кеш перестанет быть LRU). Лучше, если значение будет степенью двойки.
+py3.3. typed=False -- Если 'True', то разные типы будут кешироваться отдельно: например, результаты 'f(3)' и 'f(3.0)' будут закешированы по отдельности.
+py3.3. typed=False -- Если 'True', то разные типы будут кешироваться отдельно: например, результаты 'f(3)' и 'f(3.0)' будут закешированы по отдельности.
LRU (least recently used) кеш — кеш с конечным размером, где часто используемые записи вытесняют прочие.
При помощи данного декоратора можно мемоизировать результат функции (запечатлеть результаты для конкретных наборов аргументов).
Такое кеширование позволяет экономить время и ресурсы, если тяжёлая функция вызывается периодически с более или менее одинаковым набором аргументов.
cache_info()
Эту функцию декоратор прикрепит к декорируемой функции. При помощи неё можно замерять эффективность кеша.
Она возвращает именованный кортеж
cache_clear()
Эту функцию декоратор прикрепит к декорируемой функции. С её помощью можно очистить/инвалидировать кеш.
__wrapped__
Этот атрибут декоратор прикрепит к декорируемой функции. В нём будет содержаться ссылка на оригинальную функцию, к которой был применён декоратор. Может быть полезно для интроспекции, обхода кеша, или для оборачивания в другой кеш.
При помощи данного декоратора можно мемоизировать результат функции (запечатлеть результаты для конкретных наборов аргументов).
Такое кеширование позволяет экономить время и ресурсы, если тяжёлая функция вызывается периодически с более или менее одинаковым набором аргументов.
from functools import lru_cache
@lru_cache(maxsize=30)
def get_articles(on_date):
# Здесь затратная операция, выбирающая статьи
# на определённую дату.
articles = [...]
return articles
get_articles('2017-12-12')
get_articles('2017-12-13')
get_articles('2017-12-12') # Взяты из кеша.
# Рассмотрим эффективность кеша:
get_articles.cache_info()
# CacheInfo(hits=1, misses=2, maxsize=20, currsize=2)
Внимание
Для кеширования результатов используется словарь, поэтому аргументы функции (именно они станут ключами словаря) должны поддерживать хеширование.
cache_info()
Эту функцию декоратор прикрепит к декорируемой функции. При помощи неё можно замерять эффективность кеша.
Она возвращает именованный кортеж
CacheInfo
со следующими атрибутами:hits | Количество попаданий в кеш. |
misses | Количество промахов мимо кеша. |
maxsize | Максимальный размер кеша. |
currsize | Текущий размер кеша. |
На заметку
Если используются нити, то значения в
hits
и misses
приблизительны.cache_clear()
Эту функцию декоратор прикрепит к декорируемой функции. С её помощью можно очистить/инвалидировать кеш.
__wrapped__
Этот атрибут декоратор прикрепит к декорируемой функции. В нём будет содержаться ссылка на оригинальную функцию, к которой был применён декоратор. Может быть полезно для интроспекции, обхода кеша, или для оборачивания в другой кеш.
Синонимы поиска: functools.lru_cache, functools, lru_cache
На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.