Кэширование запросов

Контекст

Вы разрабатываете программу для кэширования запросов к внешнему API. Часто повторяющиеся запросы занимают много времени, поэтому вы решаете создать класс LRU Cache (Least Recently Used Cache), который будет хранить ограниченное количество запросов и автоматически удалять самые старые при достижении лимита. Это позволит значительно ускорить повторяющиеся запросы, так как данные будут браться из кэша, а не отправляться повторно.

Задача

  1. Создайте класс LRU Cache, который хранит ограниченное количество объектов и, при превышении лимита, удаляет самые давние (самые старые) использованные элементы.
  2. Реализуйте методы добавления и извлечения элементов с использованием декораторов 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