如何判断具有依赖关系的Python函数是否已更改?

时间:2016-01-18 12:50:22

标签: python function caching introspection memoization

TL; DR:

如何将Python函数的结果缓存到磁盘,并在以后的会话中使用缓存的值,当且仅当函数代码及其所有依赖项自上次运行以来没有改变时?

换句话说,我想创建一个Python缓存系统,自动监视更改的代码。

背景

我正在尝试构建一个自动记忆Python计算结果的工具。我希望memoization在Python会话之间保持不变(即稍后可以在另一个Python实例中重用,最好是在具有相同Python版本的另一台机器上)。

假设我有一个带有一些函数mymodule的Python模块mymodule.func()。假设我已经解决了序列化/识别函数参数的问题,所以我们可以假设mymodule.func()如果简化了任何事情就不带参数。

还假设我保证函数mymodule.func()及其所有依赖项都是确定性的,所以mymodule.func() == mymodule.func()

任务

我想今天运行函数mymodule.func()并保存其结果(以及解决此任务所需的任何其他信息)。如果我以后想要相同的结果,我想加载缓存的结果,而不是再次运行mymodule.func()但仅,如果mymodule.func()中的代码及其依赖项没有变化。

为简化起见,我们可以假设该函数总是在一个刚刚启动的Python解释器中运行,其中包含如下最小的脚本:

import some_save_function
import mymodule
result = mymodule.func()
some_save_function(result, 'filename')

另外,请注意我不想过于保守。在第一次运行时使用modulefinder模块查找所涉及的所有模块可能并不太难,如果任何模块完全没有更改,则不使用缓存。但是这违背了我的目的,因为在我的用例中,导入模块中的某些不相关的函数很可能已经改变。

我查看过的以前的工作和工具

  • joblib记忆与函数名称相关的结果,并保存源代码,以便我们检查它是否未更改。但是,据我所知,它不会检查上游函数(由mymodule.func()调用)。
  • ast模块给了我任何Python代码的抽象语法树,所以我想我(原则上)可以用这种方式来理解它。这有多难?我对AST不是很熟悉。
  • 我可以使用dill里面发生的所有黑魔法吗?
  • 比解决方案更多的琐事:IncPy,一个已完成/已故的研究项目,默认情况下实现了Python解释器。不错的想法,但从未在实验室外进行过。

感谢任何输入!

0 个答案:

没有答案