我一直在寻找一个python模块,它提供了一个具有以下功能的memoize装饰器:
我找到了一些用于此任务的小代码片段,并且可能自己实现了一个,但我更愿意为此任务创建一个已建立的软件包。我还发现incpy,但这似乎不适用于标准的python解释器。
理想情况下,我希望在磁盘上添加functools.lru_cache
和缓存存储。有人能为我指出一个合适的包吗?
答案 0 :(得分:2)
我不知道任何memoize装饰师负责所有这些,但你可能想看看ZODB。它是一个基于pickle
构建的持久性系统,它提供了一些额外的功能,包括能够在不使用时将对象从内存移动到磁盘,以及只保存已修改过的对象的能力。
编辑:作为评论的后续行动。 ZODB不支持开箱即用的装饰装饰器。但是,我认为你可以:
之后,如果您创建该类的对象并将其添加到ZODB数据库,则在执行其中一个memoized方法时,该对象将被标记为脏,并且更改将在下一个事务中保存到数据库中提交操作。
答案 1 :(得分:2)
我意识到这是一个有两年之久的问题,而且这不会算作“已建立”的装饰者,而是......
这很简单,你真的不需要担心只使用已建立的代码。该模块的docs链接指向source,因为除了本身有用之外,它还可以作为示例代码。
那么,您需要添加什么?添加filename
参数。在运行时,pickle.load
将cache
文件名放入{}
,如果失败则使用cache_save
。将只有pickle.save
缓存的wrapper
函数添加到锁定下的文件中。将该函数附加到cache_info
与现有函数相同(atexit.register
等)。
如果您想自动保存缓存,而不是将其留给调用者,那很容易;这只是一个什么时候这样做的问题。您提出的任何选项 - save_every
,添加save_every
参数,以便保存每cache_info
个未命中,...... - 实现起来很简单。在this answer中,我展示了它所付出的努力。或者,您可以获得完整的工作版本(自定义或按原样使用)on GitHub。
还有其他方法可以扩展它 - 在{{1}}中放置一些与保存相关的统计信息(自上次保存以来的上次保存时间,命中和未命中,......),复制缓存并将其保存在后台线程中而不是保存内联等。但我想不出任何值得做的事情并不容易。