欢迎访问宙启技术站
智能推送

使用collections模块实现LRU缓存功能

发布时间:2024-01-06 11:05:03

LRU(Least Recently Used)缓存是一种常见的缓存替换策略,它会删除最近最久未使用的缓存项。

使用Python的collections模块中提供的OrderedDict类,可以辅助实现LRU缓存功能。OrderedDict是一个有序字典,它的特点是插入顺序始终保持不变,即新插入的项始终位于字典的最后面。

下面是一个实现LRU缓存功能的例子:

from collections import OrderedDict

class LRUCache:
    def __init__(self, capacity):
        self.capacity = capacity
        self.cache = OrderedDict()

    def get(self, key):
        if key in self.cache:
            value = self.cache[key]
            # 将当前访问的项移到最后面,即最新访问
            del self.cache[key]
            self.cache[key] = value
            return value
        else:
            return -1

    def put(self, key, value):
        if key in self.cache:
            # 如果已存在该项,删除并重新插入到最后面,即更新其访问时间
            del self.cache[key]
        elif len(self.cache) >= self.capacity:
            # 如果缓存已满,删除最久未使用的项,即最旧访问
            self.cache.popitem(last=False)
        self.cache[key] = value

# 使用例子
cache = LRUCache(2)

cache.put(1, 1)
cache.put(2, 2)
print(cache.get(1))  # 输出 1

cache.put(3, 3)  # 缓存已满,将删除最久未使用的项 2
print(cache.get(2))  # 输出 -1,因为被删除了

cache.put(4, 4)  # 缓存已满,将删除最久未使用的项 1
print(cache.get(1))  # 输出 -1,因为被删除了
print(cache.get(3))  # 输出 3
print(cache.get(4))  # 输出 4

在上面的例子中,LRUCache类基于OrderedDict实现了一个LRU缓存,构造函数接收一个容量参数用于指定缓存的最大项数。get方法可以从缓存中获取一个项,如果项存在,则会将其移到最后面,否则返回-1。put方法用于插入一个项到缓存中,如果该项已存在,则会将其移到最后面,如果缓存已满,则会删除最久未使用的项。

在使用例子中,我们创建了一个容量为2的缓存,并分别插入了1、2、3、4作为键值对。在插入过程中,由于缓存容量为2,所以当插入第3个键值对时,缓存已满,会删除最旧访问的项2。最后通过get方法获取各个键的值以验证缓存是否按照LRU策略工作。