如何解决如何腌制“记忆化”的 Python 函数?
我有以下代码:
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 秒即可完成.这是因为当我用 dill 加载 MEM
时,它由访问速度较慢的结构表示吗?我尝试过复制和深度复制 MEM,这只会使问题变得更糟(尤其是深度复制,即使是较小的输入也需要几秒钟的时间)。
解决方法
-
只腌制一次或尽可能少腌制是有意义的。
-
在许多情况下运行该函数时,最好避免循环并使用诸如利用 C 代码的 .apply 之类的函数。
-
也许您可以并行化,这样您就可以使用所有内核来完成任务。也许这会有所帮助:https://stackoverflow.com/a/66079049/7127519
MEM = dill.load(...)
这会创建一个名为 MEM
的新局部变量,但不会更改默认参数 MEM
。
因此,默认参数 MEM
是一个空字典,并且该文件在每次调用该函数时都会被取消。
要实际更改默认参数,您可以简单地使用:
MEM.update(dill.load(...))
见https://docs.python.org/3/library/stdtypes.html#dict.update。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。