使用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策略工作。
