可调用的持久缓存结果
percache的Python项目详细描述
percache是一个python模块,用于持久缓存函数(或 (通常是可调用的)使用decorators。
它在某种程度上类似于python decorator中的Memoize Example 库,但其优点是结果将持久地存储在 隐藏物。percache在对 python解释器。
使用pip install percache安装percache适用于Python 2.6、2.7, 和3.3,并且在标准库之外没有依赖项
示例
>>> import percache >>> cache = percache.Cache("/tmp/my-cache") >>> >>> @cache ... def longtask(a, b): ... print("running a long task") ... return a + b ... >>> longtask(1, 2) running a long task 3 >>> >>> longtask(1, 2) 3 >>> cache.close() # writes new cached results to disk
正如您在第二次调用后丢失的输出中看到的,longtask 只打过一次电话第二次从 隐藏物。这个模块的关键特性是它可以跨多个 调用Python解释器
对要缓存的结果的一个要求是它们是pickable
每个缓存文件可以用于任意数量的不同命名的可调用文件。
备用后端和实时同步
默认情况下,percache使用shelve作为其缓存后端。替代方案 如果后端作为字典式对象提供,则可以使用 close()和sync()方法:
>>> class FooCache(dict): ... def sync(self): ... ... ... def close(self): ... ... >>> fc = FooCache() >>> cache = percache.Cache(fc, livesync=True)
在本例中,缓存是在实时同步模式下创建的,即结果 立即被永久存储。通常在缓存 close()方法已被调用,或者直到它得到finalized请注意 实时同步模式可能会减慢percache修饰的功能(尽管 降低“失去”结果的风险)。
缓存详细信息(您应该知道)
缓存可调用结果时,基于可调用名称的SHA1哈希 参数用作将结果存储到缓存文件中的键
哈希计算不直接处理参数,而是处理它们 表示,即通过应用repr()返回的字符串。论据 表示应该充分区分 函数的用途,但在 python解释器。默认情况下,内置函数repr()用于获取 参数表示。这非常适合基本类型、列表、元组 以及它们的组合,但在其他类型上可能会失败:
>>> repr(42) 42 # good >>> repr(["a", "b", (1, 2L)]) "['a', 'b', (1, 2L)]" # good >>> o = object() >>> repr(o) '<object object at 0xb769a4f8>' # bad (address is dynamic) >>> repr({"a":1,"b":2,"d":4,"c":3}) "{'a': 1, 'c': 3, 'b': 2, 'd': 4}" # bad (order may change) >>> class A(object): ... def __init__(self, a): ... self.a = a ... >>> repr(A(36)) '<__main__.A object at 0xb725bb6c>' # bad (A.a not considered) >>> repr(A(35)) '<__main__.A object at 0xb725bb6c>' # bad (A.a not considered)
在python调用中,bad表示是不相同的 (所有bad示例)或没有充分区分值的示例 (最后2个bad示例)。
无论如何,要使用这种类型,您可以
- 相应地实现类型的__repr__()方法或
- 使用的repr关键字提供自定义表示函数 Cache构造函数
实现__repr__()方法
要将字典传递给percache修饰函数,可以将它们包装在 一个拥有合适的__repr__()方法的字典类型:
>>> class mydict(dict): ... def __repr__(self): ... items = ["%r: %r" % (k, self[k]) for k in sorted(self)] ... return "{%s}" % ", ".join(items) ... >>> repr(mydict({"a":1,"b":2,"d":4,"c":3})) "{'a': 1, 'b': 2, 'c': 3, 'd': 4}" # good (always same order)
提供自定义的repr()函数
下面的示例演示如何使用自定义表示函数来获取 file对象的适当参数表示:
>>> def myrepr(arg): ... if isinstance(arg, file): ... # return a string with file name and modification time ... return "%s:%s" % (arg.name, os.fstat(arg.fileno())[8]) ... else: ... return repr(arg) ... >>> cache = percache.Cache("/some/path", repr=myrepr)
客房服务
- 确保在缓存函数的行为发生时删除缓存文件 已经改变了!
- 为了防止缓存变得越来越大,可以调用
^Cache实例的{tt15}$方法默认情况下,它清除all
来自缓存的结果。关键字maxagemy用于指定
自从缓存结果为^ {EM1}$以来使用的最大秒数
上次。任何结果在maxage秒内未使用(写入或访问) 从缓存中删除。
更改
版本0.3.0
- 支持Python3.3(仅次于2.6和2.7)
版本0.2.1
- 将缺少的自述文件添加到pypi包。
版本0.2
- 完成时自动关闭(即同步)缓存。
- 可以选择在每次更改时同步缓存。
- 支持备用后端(除了shelve)。
- cache对象现在是可调用的,这使得显式的check()方法 已过时(尽管仍支持旧接口)。
版本0.1.1
- 修复命令行接口的错误使用期限输出。
- 在半路与派林特会合
版本0.1
- 初始版本