是否有为python建立的memoize on-disk装饰器?

时间:2011-12-08 08:24:01

标签: python decorator memoization

我一直在寻找一个python模块,它提供了一个具有以下功能的memoize装饰器:

  • 将缓存存储在磁盘上,以便在后续程序运行中重复使用。
  • 适用于任何可挑剔的参数,最重要的是numpy数组。
  • (Bonus)检查参数是否在函数调用中发生变异。

我找到了一些用于此任务的小代码片段,并且可能自己实现了一个,但我更愿意为此任务创建一个已建立的软件包。我还发现incpy,但这似乎不适用于标准的python解释器。

理想情况下,我希望在磁盘上添加functools.lru_cache和缓存存储。有人能为我指出一个合适的包吗?

2 个答案:

答案 0 :(得分:2)

我不知道任何memoize装饰师负责所有这些,但你可能想看看ZODB。它是一个基于pickle构建的持久性系统,它提供了一些额外的功能,包括能够在不使用时将对象从内存移动到磁盘,以及只保存已修改过的对象的能力。

编辑:作为评论的后续行动。 ZODB不支持开箱即用的装饰装饰器。但是,我认为你可以:

  • 实施您自己的persistent class
  • 在您需要的方法中使用memoization装饰器(任何标准实现都应该有效,但可能需要进行修改以确保dirty bit已设置)

之后,如果您创建该类的对象并将其添加到ZODB数据库,则在执行其中一个memoized方法时,该对象将被标记为脏,并且更改将在下一个事务中保存到数据库中提交操作。

答案 1 :(得分:2)

我意识到这是一个有两年之久的问题,而且这不会算作“已建立”的装饰者,而是......

这很简单,你真的不需要担心只使用已建立的代码。该模块的docs链接指向source,因为除了本身有用之外,它还可以作为示例代码。

那么,您需要添加什么?添加filename参数。在运行时,pickle.loadcache文件名放入{},如果失败则使用cache_save。将只有pickle.save缓存的wrapper函数添加到锁定下的文件中。将该函数附加到cache_info与现有函数相同(atexit.register等)。

如果您想自动保存缓存,而不是将其留给调用者,那很容易;这只是一个什么时候这样做的问题。您提出的任何选项 - save_every,添加save_every参数,以便保存每cache_info个未命中,...... - 实现起来很简单。在this answer中,我展示了它所付出的努力。或者,您可以获得完整的工作版本(自定义或按原样使用)on GitHub

还有其他方法可以扩展它 - 在{{1}}中放置一些与保存相关的统计信息(自上次保存以来的上次保存时间,命中和未命中,......),复制缓存并将其保存在后台线程中而不是保存内联等。但我想不出任何值得做的事情并不容易。