如何 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]
而我运行同时f
和f2
进行了四千次输入,f
需要半小时才能完成,但[=只需要40秒] =16=]完成。这是因为当我用 dill 加载 MEM
时,它由访问速度较慢的结构表示吗?我已经尝试复制和深度复制 MEM,这只会使问题变得更糟(尤其是使用深度复制,那么即使是更小的输入也需要几秒钟的时间)。
只解泡一次或尽可能少解泡菜是有意义的。
当 运行 函数在很多情况下,最好避免循环并改用函数,例如利用 C 代码的 .apply。
也许您可以并行化,这样您就可以使用所有核心来完成任务。也许这有帮助:
MEM = dill.load(...)
这会创建一个名为 MEM
的新局部变量,但不会更改默认参数 MEM
。
因此,默认参数 MEM
是一个空字典,并且文件在每次 调用函数时 都被 unpickled。
要实际更改默认参数,您可以简单地使用:
MEM.update(dill.load(...))
见https://docs.python.org/3/library/stdtypes.html#dict.update。
我有以下代码:
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]
而我运行同时f
和f2
进行了四千次输入,f
需要半小时才能完成,但[=只需要40秒] =16=]完成。这是因为当我用 dill 加载 MEM
时,它由访问速度较慢的结构表示吗?我已经尝试复制和深度复制 MEM,这只会使问题变得更糟(尤其是使用深度复制,那么即使是更小的输入也需要几秒钟的时间)。
只解泡一次或尽可能少解泡菜是有意义的。
当 运行 函数在很多情况下,最好避免循环并改用函数,例如利用 C 代码的 .apply。
也许您可以并行化,这样您就可以使用所有核心来完成任务。也许这有帮助:
MEM = dill.load(...)
这会创建一个名为 MEM
的新局部变量,但不会更改默认参数 MEM
。
因此,默认参数 MEM
是一个空字典,并且文件在每次 调用函数时 都被 unpickled。
要实际更改默认参数,您可以简单地使用:
MEM.update(dill.load(...))
见https://docs.python.org/3/library/stdtypes.html#dict.update。