可调用的持久缓存结果

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示例)。

无论如何,要使用这种类型,您可以

  1. 相应地实现类型的__repr__()方法或
  2. 使用的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

  • 初始版本

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

推荐PyPI第三方库


热门话题
datetime如何使用JodaTime在Java中设置时间属性   java固定算法的性能时间   java如何从JMenu中获取所选项以更改文本区域的文本颜色?   java配置单元UDF传递数组<string>作为参数   javaapachebeam和BigQuery   java与PrintWriter之间的差异。printf和PrintWriter。格式方法   继承如何处理按Java版本更改的导入,以及在多个版本上编译   xml java。lang.noClassDefFoundant生成错误   java如何使用包含映射的JSON发送POST请求?   java如何在任何应用程序的JAR文件中绑定MySql数据库?   Java脚本解释器   sslhttpclientjava。网SocketException:未实现未连接的socket   java如何为Android应用程序创建类似于Cron作业的东西   java JButton+radiobox+复选框   java内存管理将文件写入内存   java这是计算对象实例的有效方法吗?   用于死锁情况的java代码?   JavaSpring容器作为新实体插入,而不是存储在表中