📜  在Python使用装饰器进行记忆

📅  最后修改于: 2021-09-17 07:18:11             🧑  作者: Mango

递归是一种编程技术,其中函数重复调用自身直到满足终止条件。使用递归的一些例子是:计算斐波那契级数、阶乘等。 但它们的问题是在递归树中,已经解决的子问题可能会再次被解决,这就增加了到开销。

Memoization 是一种记录中间结果的技术,可用于避免重复计算并加快程序运行速度。它可用于优化使用递归的程序。在Python,可以在函数装饰器的帮助下完成记忆。

让我们以计算一个数的阶乘为例。下面的简单程序使用递归来解决问题:

# Simple recursive program to find factorial
def facto(num):
    if num == 1:
        return 1
    else:
        return num * facto(num-1)
          
  
print(facto(5))

可以使用装饰器通过记忆化来优化上述程序。

# Factorial program with memoization using
# decorators.
  
# A decorator function for function 'f' passed
# as parameter
def memoize_factorial(f):
    memory = {}
  
    # This inner function has access to memory
    # and 'f'
    def inner(num):
        if num not in memory:         
            memory[num] = f(num)
        return memory[num]
  
    return inner
      
@memoize_factorial
def facto(num):
    if num == 1:
        return 1
    else:
        return num * facto(num-1)
  
print(facto(5))

解释:
1. 定义了一个名为memoize_factoria l 的函数。它的主要目的是将中间结果存储在称为内存的变量中。
2、第二个函数factoro是计算阶乘的函数。它已由装饰器(函数memoize_factorial)注释。由于闭包的概念, facto可以访问内存变量。注解相当于写,

facto = memoize_factorial(facto)

3. 当调用 facto(5) 时,除了存储中间结果之外,还会发生递归操作。每次需要进行计算时,都会检查结果是否在内存中可用。如果是,则使用它,否则,计算该值并存储在内存中
4. 我们可以验证 memoization 确实有效,请看这个程序的输出。