说我是一个从给定参数创建字典的方法:
def newDict(a,b,c,d): # in reality this method is a bit more complex, I've just shortened for the sake of simplicity
return { "x": a,
"y": b,
"z": c,
"t": d }
我有另一个方法,每次执行时调用newDict方法。因此,最后,当我看到我的cProfiler时,我看到这样的事情:
17874 calls (17868 primitive) 0.076 CPU seconds
当然,我的newDict方法被称为1785
次。现在,我的问题是我是否可以记住newDict方法以减少通话时间? (只是为了确保,变量几乎在每个调用中都会发生变化,但我不确定它是否对记忆函数有影响)
子问题:我认为17k调用太多,代码效率不高。但是,通过查看统计数据,您还可以说明这是正常结果还是我有太多的电话而且代码很慢?
答案 0 :(得分:9)
memoize
而不是memorize
。答案 1 :(得分:8)
如果记住你的意思是记忆,请使用functools.lru_cache
。
这是一个功能装饰器
答案 2 :(得分:2)
记忆的目的是保存执行成本高昂的操作结果,以便可以提供第二,第三等时间,而不必重复操作并反复产生费用。
记忆通常应用于(a)执行昂贵操作的函数,(b)在给定相同参数的情况下始终产生相同的结果,(c)对程序状态没有副作用。
通常通过“保存”结果以及产生该结果的参数值,在这样的函数中实现记忆。这是缓存的一般概念的特殊形式。每次调用该函数时,该函数都会检查其备忘录缓存,以查看它是否已经确定了适合于参数当前值的结果。如果缓存包含结果,则可以返回它而无需重新计算它。
您的函数似乎是为了在每次调用时创建一个新的dict。似乎没有一种合理的方法来记住这个函数:你总是想要一个新的dict返回给调用者,这样它使用它接收的dict就不会干扰对函数的其他调用。
我可以使用memoizing进行可视化的唯一方法是(1)放入结果中的一个或多个值的计算是否昂贵(在这种情况下,我可能会定义一个计算值并记住该函数的函数) )或(2)newDict函数用于在给定一组特定参数值的情况下返回相同的值集合。在后一种情况下,我不会使用dict,而是使用不可修改的对象(例如,类似dict的类,但保护其不修改其内容)。
关于你的子问题,你需要问的问题是(1)是newDict被称为适当的次数,(2)每次执行newDict的执行时间是否可以减少。这是两个独立且独立的问题,需要酌情单独解决。
BTW你的函数定义中有一个拼写错误 - return的关键字和open括号之间的返回不应该有'd'。