TIL вы можете кэшировать результаты вызова вашей функции в python с помощью декораторов @lru_cache и @cache из модуля python functools, чтобы последующие вызовы функция с теми же аргументами может вернуть кэшированный результат, а не пересчитывать его.

Что такое кэш?

Вы можете думать о кеше как о версии мемоизации, вы уменьшаете накладные расходы на вычисления, сохраняя предварительно вычисленный результат, к которому нужно обращаться повторно.

Что такое кэш LRU?

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

Как работает декоратор lru_cache?

Декоратор lru_cache работает, сохраняя словарь результатов предыдущих вызовов функций с входными аргументами вызова функции в качестве ключей. Когда функция вызывается с набором аргументов, который уже находится в кэше, вместо повторного вычисления результата возвращается кэшированный результат. Это может быть полезно для повышения производительности функций, которые повторно вызываются с одними и теми же аргументами, особенно если функция требует больших затрат на вычисление.

Декоратор lru_cache также позволяет указать максимальный размер кеша, если он указан, как только хранилище будет заполнено, последний использованный элемент будет удален для хранения новых элементов. Декоратор является потокобезопасным, поэтому вы можете использовать обернутую функцию и в многопоточной среде.

В приведенном выше примере я показал, как вы можете использовать декоратор для кэширования результата функции fibonacci. Обратите внимание, поскольку аргумент max_size равен None, ключ кэша не будет удален. Обертка позволяет легко сделать то же самое вместо того, чтобы использовать dict и реализовывать логику самостоятельно.

Также есть декоратор cache, который можно использовать в местах, где вам не нужно удалять элемент кеша.

Использованная литература: