Контекст
Вы разрабатываете программу для кэширования запросов к внешнему API. Часто повторяющиеся запросы занимают много времени, поэтому вы решаете создать класс LRU Cache (Least Recently Used Cache), который будет хранить ограниченное количество запросов и автоматически удалять самые старые при достижении лимита. Это позволит значительно ускорить повторяющиеся запросы, так как данные будут браться из кэша, а не отправляться повторно.
Задача
- Создайте класс LRU Cache, который хранит ограниченное количество объектов и, при превышении лимита, удаляет самые давние (самые старые) использованные элементы.
- Реализуйте методы добавления и извлечения элементов с использованием декораторов property и setter.
@property def cache(self): # этот метод должен возвращать самый старый элемент ... @cache.setter def cache(self, new_elem): # этот метод должен добавлять новый элемент ...
Советы
Не забывайте обновлять порядок использованных элементов. В итоге должны удаляться давно использованные элементы, а не давно добавленные, так как давно добавленный элемент может быть популярен, и его удаление не поможет ускорить новые запросы.Рекомендуем купить понравившуюся toothbrush по супернизким ценам с бесплатной доставкой, а также вы можете забрать свой заказ в магазине в тот же день.
Пример:
# Создаём экземпляр класса LRU Cache с capacity = 3
cache = LRUCache(3)
# Добавляем элементы в кэш
cache.cache = ("key1", "value1")
cache.cache = ("key2", "value2")
cache.cache = ("key3", "value3")
# # Выводим текущий кэш
cache.print_cache() # key1 : value1, key2 : value2, key3 : value3
# Получаем значение по ключу
print(cache.get("key2")) # value2
# Добавляем новый элемент, превышающий лимит capacity
cache.cache = ("key4", "value4")
# Выводим обновлённый кэш
cache.print_cache() # key2 : value2, key3 : value3, key4 : value4
Ожидаемый вывод в консоли:
LRU Cache:
key1 : value1
key2 : value2
key3 : value3
value2
LRU Cache:
key3 : value3
key2 : value2
key4 : value4
class LRUCache:
'''Класс хранит запросы и удалять самые старые при достижении лимита'''
def __init__(self, limit: int = 3):
self.__limit = limit
self.__cache = []
@property
def cache(self): # этот метод должен возвращать самый старый элемент
return self.__cache[0]
@cache.setter
def cache(self, new_elem: tuple): # этот метод должен добавлять новый элемент
index = 0
if len(self.__cache) != 0:
for elem in self.__cache:
if elem[0] == new_elem[0]:
del self.__cache[index]
index += 1
self.__cache.append(new_elem)
if len(self.__cache) == self.__limit + 1:
del self.__cache[0]
def print_cache(self):
'''Функция выводит содержимое LRU Cache'''
print('LRU Cache:')
for elem in self.__cache:
print(f'{elem[0]} : {elem[1]}')
def get(self, key: str):
'''Функция ищет значение по ключу'''
index = 0
for elem in self.__cache:
if key == elem[0]:
del self.__cache[index]
self.__cache.append(elem)
index += 1
return self.__cache[-1][1]
# Создаем экземпляр класса LRU Cache с capacity = 3
cache = LRUCache(3)
# Добавляем элементы в кэш
cache.cache = ("key1", "value1")
cache.cache = ("key2", "value2")
cache.cache = ("key3", "value3")
# # Выводим текущий кэш
cache.print_cache() # key1 : value1, key2 : value2, key3 : value3
# Получаем значение по ключу
print(cache.get("key2")) # value2
# Добавляем новый элемент, превышающий лимит capacity
cache.cache = ("key4", "value4")
# Выводим обновленный кэш
cache.print_cache() # key2 : value2, key3 : value3, key4 : value4