为了账号安全,请及时绑定邮箱和手机立即绑定

什么是回忆录,我如何在Python中使用它?

什么是回忆录,我如何在Python中使用它?

幕布斯6054654 2019-06-10 17:00:32
什么是回忆录,我如何在Python中使用它?我刚开始Python我不知道回忆录以及如何使用它。另外,可以给我一个简化的例子吗?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

回溯有效地指基于方法输入的方法调用的结果(“回忆录”→“备忘录”被记住的→“)结果,然后返回记住的结果,而不是再次计算结果。您可以将其视为方法结果的缓存。有关更多详细信息,请参见第387页中的定义算法简介(3E),Cormen等人。

使用Python中的回忆录计算阶乘的一个简单示例如下所示:

factorial_memo = {}def factorial(k):
    if k < 2: return 1
    if k not in factorial_memo:
        factorial_memo[k] = k * factorial(k-1)
    return factorial_memo[k]

您可以变得更复杂,并将回忆录过程封装到一个类中:

class Memoize:
    def __init__(self, f):
        self.f = f
        self.memo = {}
    def __call__(self, *args):
        if not args in self.memo:
            self.memo[args] = self.f(*args)
        #Warning: You may wish to do a deepcopy here if returning objects
        return self.memo[args]

然后:

def factorial(k):
    if k < 2: return 1
    return k * factorial(k - 1)factorial = Memoize(factorial)

一种被称为“装饰师“是在Python2.4中添加的,它允许您现在只需编写以下代码就可以完成相同的任务:

@Memoizedef factorial(k):
    if k < 2: return 1
    return k * factorial(k - 1)

这个PythonDecorator库有一个类似的装饰师memoized这比Memoize这里所示的班级。


查看完整回答
反对 回复 2019-06-10
?
慕神8447489

TA贡献1780条经验 获得超1个赞

Python 3.2的新版本是functools.lru_cache..默认情况下,它只缓存最近使用的128个调用,但是可以将maxsizeNone若要指示缓存不应过期,请执行以下操作:

import functools@functools.lru_cache(maxsize=None)def fib(num):
    if num < 2:
        return num    else:
        return fib(num-1) + fib(num-2)

这个函数本身是非常慢的,请尝试fib(36)你得等十秒钟。

加法lru_cache注释确保如果函数是最近为特定值调用的,它不会重新计算该值,而是使用缓存的前一个结果。在这种情况下,它带来了巨大的速度改进,而代码并没有被缓存的细节弄得乱七八糟。


查看完整回答
反对 回复 2019-06-10
?
慕森卡

TA贡献1806条经验 获得超8个赞

其他的答案涵盖了它是相当好的。我不重复了。只是一些对你有用的观点。

通常,回忆录是一种运算,你可以应用于任何计算某物(昂贵)并返回一个值的函数。正因为如此,它通常被实现为装饰师..这个实现很简单,它应该是这样的

memoised_function = memoise(actual_function)

或表示为装潢师

@memoisedef actual_function(arg1, arg2):
   #body


查看完整回答
反对 回复 2019-06-10
  • 3 回答
  • 0 关注
  • 524 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信