如何 pickle "memoized" Python 函数?

How do I pickle a "memoized" Python function?

我有以下代码:

def f(input,MEM={}):
    if len(MEM) == 0:
        with open('dill.pkl', 'rb') as f:
            MEM = dill.load(f)
    if input not in MEM:
        intended_output = complex_function(input)
        MEM[input] = intended_output
    return MEM[input]

运行 长批输入,我发现我的代码 运行 比我最初没有加载 MEM 慢得多。即,

def f(input,MEM={}):
    if len(MEM) == -1:
        return None
    if input not in MEM:
        intended_output = complex_function(input)
        MEM[input] = intended_output
    return MEM[input]

而我运行同时ff2进行了四千次输入,f需要半小时才能完成,但[=只需要40秒] =16=]完成。这是因为当我用 dill 加载 MEM 时,它由访问速度较慢的结构表示吗?我已经尝试复制和深度复制 MEM,这只会使问题变得更糟(尤其是使用深度复制,那么即使是更小的输入也需要几秒钟的时间)。

  1. 只解泡一次或尽可能少解泡菜是有意义的。

  2. 当 运行 函数在很多情况下,最好避免循环并改用函数,例如利用 C 代码的 .apply。

  3. 也许您可以并行化,这样您就可以使用所有核心来完成任务。也许这有帮助:

MEM = dill.load(...)

这会创建一个名为 MEM 的新局部变量,但不会更改默认参数 MEM

因此,默认参数 MEM 是一个空字典,并且文件在每次 调用函数时 都被 unpickled。

要实际更改默认参数,您可以简单地使用:

MEM.update(dill.load(...))

https://docs.python.org/3/library/stdtypes.html#dict.update