LRU (Least Recently Used) Cache удаляет наименее недавно использованный элемент, когда кэш достигает своей максимальной ёмкости. Python предлагает два основных подхода к реализации.
lru_cacheСамый простой вариант — это functools.lru_cache, идеален для кэширования результатов чистых функций:
from functools import lru_cache
@lru_cache(maxsize=128)
def expensive_function(n):
return n * n
.cache_info()OrderedDictДля гибкого LRU кэша на основе класса используй collections.OrderedDict, который сохраняет порядок вставки:
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity):
self.cache = OrderedDict()
self.capacity = capacity
def get(self, key):
if key in self.cache:
self.cache.move_to_end(key) # Отметить как недавно использованный
return self.cache[key]
return -1
def put(self, key, value):
if key in self.cache:
self.cache.move_to_end(key) # Обновить позицию
self.cache[key] = value
if len(self.cache) > self.capacity:
self.cache.popitem(last=False) # Удалить наименее недавно использованный
move_to_end(key) — отмечает доступный элемент как самый недавно использованныйpopitem(last=False) — удаляет самый старый (наименее недавно использованный) элементget и put выполняются за O(1)@lru_cache для быстрой мемоизации вызовов функцийOrderedDict, когда нужен универсальный переиспользуемый кэш с своей логикой вытеснения элементовДекоратор functools.lru_cache является потокобезопасным и предоставляет встроенную статистику кэша через метод .cache_info(), что делает его подходящим как для мемоизации функций, так и для хранения данных в виде ключ-значение общего назначения.
Новый — ещё не проверен сообществом
Вы