python如何memoize方法

时间:2011-08-16 11:56:27

标签: python performance memoization cprofile

说我是一个从给定参数创建字典的方法:

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调用太多,代码效率不高。但是,通过查看统计数据,您还可以说明这是正常结果还是我有太多的电话而且代码很慢?

3 个答案:

答案 0 :(得分:9)

  1. 您的意思是memoize而不是memorize
  2. 如果值几乎总是不同的,那么记忆将无济于事,它会减慢速度。
  3. 如果没有看到您的完整代码,并且知道它应该做什么,我们怎么知道17k的电话是很多还是很少?

答案 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'。