带有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 LRUDict
0

如您所见,即使我们使用键 3 作为最后一个访问条目 第一,条目现在消失了,因为它没有从 调用 peek

类lrudict支持标准python的一个子集dict 接口。特别是,我们可以在键、值和 LRU指令的项目:

>>> from darts.lib.utils.lru import LRUDict
1

注意,没有保证顺序;特别是,元素 不是按优先顺序生成的。类似于普通的录音, lru dict的"iter"实际上是 iterkeys 的任何别名。

此外,我们可以从dict中删除所有元素:

< Buff行情>
>>> from darts.lib.utils.lru import LRUDict
2

螺纹安全性

类的实例不是线程安全的。更糟的是:甚至是并发的 只读访问不是线程安全的,必须由 客户端应用程序。

但是,有一个类synchronizedlrudict,它公开了 与普通的lrudict接口相同,但完全线程安全。以下 会话正好包含了步骤,我们已经尝试了一个简单的研究, 但现在使用同步版本:

>>> from darts.lib.utils.lru import LRUDict
3

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Windows 7 64位上运行Jive Dev Enrivoment的java   Java/C/C++/C#/PHP到Pascal的转换器?   java将字符串列表转换为单个对象   java SimpleAdapter,spinner中的文本和图像   java当客户端返回时,有状态会话bean如何恢复状态?   JavaWebLogic。jdbc。包装纸。无法将数组\u oracle\u sql\u数组强制转换为oracle。sql。大堆   java MySQL/Hibernate检索列映射为LocalTime的错误数据   java如何检测页面中是否包含句子(模糊)?   java如何在springboot框架中验证wsdl   JTextPane中的java双列表项插入   java根据窗口大小调整JScrollPane的大小   sql如何在java中映射VARCHAR2(5)的类型表?   用于生成Cron表达式的java类型转换   如何将基于spring注释的Hibernate代码迁移到JavaEE   java对象作为参数?   JavaSeleniumWebDriver:在许多输入中设置值的更快方法