Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有针对python的已建立的磁盘上备忘录装饰器?_Python_Decorator_Memoization - Fatal编程技术网

是否有针对python的已建立的磁盘上备忘录装饰器?

是否有针对python的已建立的磁盘上备忘录装饰器?,python,decorator,memoization,Python,Decorator,Memoization,我一直在搜索一个python模块,该模块提供了具有以下功能的memoize装饰器: 将缓存存储在磁盘上,以便在后续程序运行中重用 适用于任何可pickle的参数,最重要的是numpy数组 (额外)检查参数是否在函数调用中发生变异 我发现了一些用于此任务的小代码片段,可能自己也可以实现一个,但我更希望为此任务提供一个已建立的包。我也发现了,但这似乎不适用于标准python解释器 理想情况下,我希望在磁盘上有plus缓存存储。有人能给我指一个合适的软件包吗?我不知道有哪一个memoize装饰程序

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

  • 将缓存存储在磁盘上,以便在后续程序运行中重用
  • 适用于任何可pickle的参数,最重要的是numpy数组
  • (额外)检查参数是否在函数调用中发生变异
我发现了一些用于此任务的小代码片段,可能自己也可以实现一个,但我更希望为此任务提供一个已建立的包。我也发现了,但这似乎不适用于标准python解释器


理想情况下,我希望在磁盘上有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似乎相当不错。但是在记忆化上下文中有什么显著的优势呢?所以我想持久化类应该是定义了记忆化装饰器的类,而记忆化缓存将是该类的一个属性。我会在不久的将来尝试这个。。。