这是一个相当不错的空间。您需要的是两个结构,您需要一些东西来告诉您您的密钥(hash
在您的情况下)是否为集合所知。对于这个,dict
是非常合适的;我们只需将 映射hash
到 ,timestamp
以便您轻松查找每个项目。按时间戳顺序迭代项目是一项特别适合堆的任务,由heapq
模块提供。每次我们看到一个键,我们都会把它作为一个元组添加到我们的堆中(timestamp, hash)
。
不幸的是,没有办法查看堆积列表并删除某些项目(因为,例如,它们已更新为稍后过期)。我们将通过忽略堆中具有与字典中的值不同的时间戳的条目来解决这个问题。
所以这里是一个开始的地方,你可能可以在包装类中添加方法来支持额外的操作,或者改变数据的存储方式:
import heapq
class ExpiringCache(object):
def __init__(self):
self._dict = {}
self._heap = []
def add(self, key, expiry):
self._dict[key] = expiry
heapq.heappush(self._heap, (expiry, key))
def contains(self, key):
return key in self._dict
def collect(self, maxage):
while self._heap and self._heap[0][0] <= maxage:
expiry, key = heapq.heappop(self._heap)
if self._dict.get(key) == expiry:
del self._dict[key]
def items(self):
return self._dict.items()
创建缓存并添加一些项目
>>> xc = ExpiringCache()
>>> xc.add('apples', 1)
>>> xc.add('bananas', 2)
>>> xc.add('mangoes', 3)
重新添加一个更晚到期的项目
>>> xc.add('apples', 4)
收集所有“早于”两个时间单位的东西
>>> xc.collect(2)
>>> xc.contains('apples')
True
>>> xc.contains('bananas')
False