Python re模块的缓存清除

ovg*_*vin 8 python regex caching

在阅读Python re模块的文档时,我决定查看re.py源代码.

当我打开它时,我发现了这个:

_cache = {}
_MAXCACHE = 100

def _compile(*key):
    cachekey = (type(key[0]),) + key
    p = _cache.get(cachekey)
    if p is not None:
        return p

    #...Here I skip some part of irrelevant to the question code...

    if len(_cache) >= _MAXCACHE:
        _cache.clear()
    _cache[cachekey] = p
    return p
Run Code Online (Sandbox Code Playgroud)

为什么_cache.clear()在达到_MAXCACHE条目时使用缓存清除?

完全清除缓存并从头开始是否常见?

为什么只是没用过最久前的兑现值被删除?

And*_*ark 5

以下是regex计划用于缓存的新模块的开发人员之一的引用,这是将新模块与当前re模块分开的功能列表的一部分.

7)修改重新编译的表达式缓存以更好地处理颠簸情况.目前,当编译正则表达式时,结果将被缓存,以便如果再次编译同一表达式,则从缓存中检索它,并且不需要进行额外的工作.此缓存最多支持100个条目.达到第100个条目后,将清除缓存并且必须进行新的编译.危险,一切都很罕见,是一个人可能编译第100个表达式只是为了找到一个重新编译它并且必须在3个表达式之前完成相同的工作.通过稍微修改这个逻辑,可以建立一个任意计数器,为每个编译的条目提供时间戳,而不是在达到容量时清除整个缓存,只消除最旧的一半缓存,保持一半更多最近.这应该限制在不断重新编译大量正则表达式的情况下发生颠簸的可能性.除此之外,我将限制更新为256个条目,这意味着保留了最近的128个条目.

http://bugs.python.org/issue2636

这似乎表明,开发人员的懒惰或"强调可读性"更有可能解释当前的缓存行为.


g.d*_*d.c 3

如果我不得不猜测,我会说这样做是为了避免跟踪各个值在缓存中存储的时间/时间,这会产生内存和处理开销。由于所使用的缓存对象是一个字典,它本质上是无序的,因此在没有其他缓存对象的情况下,没有好的方法可以知道向其中添加了哪些顺序项。假设您使用的是 Python >= 2.7,可以通过使用 OrderedDict 代替标准字典来解决这个问题,但否则,您需要显着重新设计缓存的实现方式,以便消除对clear()