是否有针对python的已建立的磁盘上备忘录装饰器?
我一直在搜索一个python模块,该模块提供了具有以下功能的memoize装饰器:是否有针对python的已建立的磁盘上备忘录装饰器?,python,decorator,memoization,Python,Decorator,Memoization,我一直在搜索一个python模块,该模块提供了具有以下功能的memoize装饰器: 将缓存存储在磁盘上,以便在后续程序运行中重用 适用于任何可pickle的参数,最重要的是numpy数组 (额外)检查参数是否在函数调用中发生变异 我发现了一些用于此任务的小代码片段,可能自己也可以实现一个,但我更希望为此任务提供一个已建立的包。我也发现了,但这似乎不适用于标准python解释器 理想情况下,我希望在磁盘上有plus缓存存储。有人能给我指一个合适的软件包吗?我不知道有哪一个memoize装饰程序
- 将缓存存储在磁盘上,以便在后续程序运行中重用
- 适用于任何可pickle的参数,最重要的是numpy数组
- (额外)检查参数是否在函数调用中发生变异
理想情况下,我希望在磁盘上有plus缓存存储。有人能给我指一个合适的软件包吗?我不知道有哪一个memoize装饰程序能处理所有这些,但你可能想看看。它是一个建立在pickle之上的持久化系统,提供了一些附加功能,包括在不使用对象时将对象从内存移动到磁盘,以及仅保存已修改的对象 编辑:作为评论的后续内容。ZODB不支持即时可用的备忘录装饰器。但是,我认为你可以:
- 实现你自己的
- 在您需要的方法中使用memonization decorator(任何标准实现都应该可以工作,但可能需要对其进行修改以确保
之后,如果您创建该类的对象并将其添加到ZODB数据库中,当您执行其中一个已记忆的方法时,该对象将被标记为脏对象,并且在下一个事务提交操作中将更改保存到数据库中。我意识到这是一个2年前的问题,并且这不会算作“已建立”装饰师,但是 这非常简单,您真的不需要担心只使用已建立的代码。模块与的链接,因为除了本身有用之外,它还可以作为示例代码使用 那么,你需要补充什么?添加
文件名
参数。在运行时,pickle.load
将文件名加载到缓存中,如果失败,则使用{}
。添加一个cache\u save
函数,只需pickle即可。save
将缓存保存到锁下的文件中。将该函数附加到与现有函数相同的wrapper
(cache\u info
等)
如果您想自动保存缓存,而不是将其留给调用者,这很容易;这只是何时这样做的问题。您提出的任何选项-atexit.register
,添加一个save_every
参数,以便它可以保存每个save_every
未命中事件,…-都是很容易实现的。最后,我展示了它所需要的工作量是多么的小。或者您可以获得一个完整的工作版本(自定义或按原样使用)
还有其他方法可以扩展它在cache\u info
中放入一些与保存相关的统计信息(上次保存时间、上次保存后的点击数和未点击数等),复制缓存并将其保存在后台线程中,而不是内联保存,等等。但我想不出任何值得做的事情。这并不容易。谢谢你的提示。因此,在灵活地将数据存储在内存或磁盘上时,ZODB似乎相当不错。但是在记忆化上下文中有什么显著的优势呢?所以我想持久化类应该是定义了记忆化装饰器的类,而记忆化缓存将是该类的一个属性。我会在不久的将来尝试这个。。。