带有lru行为的简单字典
darts.util.lru的Python项目详细描述
LRU字典
< Buff行情>>>> from darts.lib.utils.lru import LRUDict
研究基本上是一个简单的字典,它有一个定义 最大容量,可在施工时提供,或修改 在运行时,通过 容量 属性:
>>> cache = LRUDict(1) >>> cache.capacity 1
最小容量值为1,如果有人 尝试使用小于该值的值:
>>> cache.capacity = -1 #doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: -1 is not a valid capacity >>> LRUDict(-1) #doctest: +ELLIPSIS Traceback (most recent call last): ... ValueError: -1 is not a valid capacity
lru字典不能包含超过其容量值的元素 表示,因此:
>>> cache[1] = "First" >>> cache[2] = "Second" >>> len(cache) 1
为了确保这种行为,字典将在下列情况下逐出条目 它需要为新的腾出空间。所以:
>>> 1 in cache False >>> 2 in cache True
容量可以在运行时调整。增加产能并不能 影响LRU字典中存在的元素数:
>>> cache.capacity = 3 >>> len(cache) 1 >>> cache[1] = "First" >>> cache[3] = "Third" >>> len(cache) 3
但收缩是:
>>> cache.capacity = 2 >>> len(cache) 2 >>> sorted(list(cache.iterkeys())) [1, 3]
注意,键为 2 的条目被逐出,因为它是最早的 修改容量时输入。最古老的新条目 当我们试图添加另一个 听写条目:
>>> cache[4] = "Fourth" >>> sorted(list(cache.iterkeys())) [3, 4]
下列操作会影响条目的优先级:
- `get` - `__getitem__` - `__setitem__` - `__contains__`
对现有密钥调用任何这些操作都将增强密钥的 优先权,当字典需要时,使它更不可能被逐出 为新条目腾出空间。有一个特殊的 peek 操作,它 返回与键关联的当前值,而不提高优先级 条目的数目:
>>> from darts.lib.utils.lru import LRUDict0
如您所见,即使我们使用键 3 作为最后一个访问条目 第一,条目现在消失了,因为它没有从 调用 peek
类lrudict支持标准python的一个子集dict 接口。特别是,我们可以在键、值和 LRU指令的项目:
>>> from darts.lib.utils.lru import LRUDict1
注意,没有保证顺序;特别是,元素 不是按优先顺序生成的。类似于普通的录音, lru dict的"iter"实际上是 iterkeys 的任何别名。
此外,我们可以从dict中删除所有元素:
< Buff行情>>>> from darts.lib.utils.lru import LRUDict2
螺纹安全性
类的实例不是线程安全的。更糟的是:甚至是并发的 只读访问不是线程安全的,必须由 客户端应用程序。
但是,有一个类synchronizedlrudict,它公开了 与普通的lrudict接口相同,但完全线程安全。以下 会话正好包含了步骤,我们已经尝试了一个简单的研究, 但现在使用同步版本:
>>> from darts.lib.utils.lru import LRUDict3