我该如何腌制“a”;备忘录;Python函数?
我有以下代码:我该如何腌制“a”;备忘录;Python函数?,python,query-optimization,dill,Python,Query Optimization,Dill,我有以下代码: 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
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
进行了4000次输入,完成f
需要半小时,但完成f2
只需要40秒。这是因为当我用dill加载MEM
时,它由访问速度较慢的结构表示吗?我尝试过复制和deepcopying MEM,这只会使问题变得更糟(尤其是使用deepcopy时,即使是较小的输入也需要几秒钟)
MEM
的新局部变量,但不会更改默认参数MEM
因此,默认参数MEM
是一个空字典,每次调用函数时都会取消对文件的勾选
要实际更改默认参数,只需使用:
MEM.update(dill.load(...))
看
这将创建一个名为MEM
的新局部变量,但不会更改默认参数MEM
因此,默认参数MEM
是一个空字典,每次调用函数时都会取消对文件的勾选
要实际更改默认参数,只需使用:
MEM.update(dill.load(...))
请参阅。不确定是否与问题有关,但(1)如果将
与open(…)
一起使用,则不需要f.close()
;(2) 你根本没有使用f
!?哎呀,我的意思是写MEM=dump(f)
。我不知道f.close()
没有必要,我现在也改变了。不幸的是,这并没有显著改变我代码的速度。如果你想添加自己的答案,请将其添加为答案,而不是将其编辑到问题中。我是dill
的作者。您可能想查看klepot
如何使用dill
klepto
是一个缓存库,它利用dill
来帮助记忆。不确定是否与问题有关,但是(1)如果使用打开(…)
,则不需要f.close()
;(2) 你根本没有使用f
!?哎呀,我的意思是写MEM=dump(f)
。我不知道f.close()
没有必要,我现在也改变了。不幸的是,这并没有显著改变我代码的速度。如果你想添加自己的答案,请将其添加为答案,而不是将其编辑到问题中。我是dill
的作者。您可能想查看klepot
如何使用dill
klepot
是一个缓存库,它利用dill
来帮助记忆。我知道for循环不是主要问题。我在f2
中包含了dummy for循环,它运行速度令人满意。关于第(1)项,我如何只解腌菜一次?我对dill很陌生。也许你可以在函数外和开始时取消选择。我的意思是,第一个if语句只会正确一次。因此,我不认为这是有用的。。。哦,除非这可能导致每次调用后都无法保存MEM
!好的,事实上我现在明白了。我知道for循环不是主要问题。我在f2
中包含了dummy for循环,它运行速度令人满意。关于第(1)项,我如何只解腌菜一次?我对dill很陌生。也许你可以在函数外和开始时取消选择。我的意思是,第一个if语句只会正确一次。因此,我不认为这是有用的。。。哦,除非这可能导致每次调用后都无法保存MEM
!好吧,事实上我现在明白了。