【发布时间】:2021-02-14 09:51:16
【问题描述】:
我有以下代码:
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 需要半小时才能完成,但 f2 只需 40 秒即可完成。这是因为当我用莳萝加载MEM 时,它由访问速度较慢的结构表示?我尝试过复制和深度复制 MEM,这只会使问题变得更糟(尤其是深度复制,即使是较小的输入也需要几秒钟的时间)。
【问题讨论】:
-
不确定是否与问题有关,但(1)如果使用
with open(...),则不需要f.close(); (2) 你根本没有使用f!? -
糟糕,我是想写
MEM = dump(f)。我不知道f.close()是不必要的,我现在也更改了。 -
不幸的是,这并没有明显改变我的代码速度。
-
如果您想添加自己的答案,请将其添加为答案,而不是将其编辑到问题中。
-
我是
dill作者。您可能想查看klepto如何使用dill。klepto是一个缓存库,它利用dill来帮助进行记忆..
标签: python query-optimization dill