记忆化实现之间的差异 - Python

Difference between Memoization Implementations - Python

这些记忆化实现之间有什么区别(如果存在)?是否存在一个比另一个更可取的用例? (我以这个 Fibo 递归为例)

换句话说:检查 if some_value in self.memo:if some_value not in self.memo: 之间有区别吗?如果有,是否存在更好的实现(更好地优化性能等) ?

class Fibo:
    def __init__(self):
        self.memo = {}

    """Implementation 1""" 
    def fib1(self, n):
        if n in [0,1]:
            return n

        if n in self.memo:
            return self.memo[n]

        result = self.fib1(n - 1) + self.fib1(n - 2)

        self.memo[n] = result

        return result

    """Implementation 2"""
    def fib2(self, n):
        if n in [0,1]:
            return n

        if n not in self.memo:
            result = self.fib2(n - 1) + self.fib2(n - 2)

            self.memo[n] = result

        return self.memo[n]

# Fibo().fib1(8) returns 21
# Fibo().fib2(8) returns 21

这些实现没有显着的性能差异。在我看来 fib2 是一个更 readable/pythonic 的实现,应该是首选。

我要提出的另一个建议是在 __init__ 中初始化备忘录,如下所示:

self.memo = {0:0, 1:1}

这避免了在每次调用中进行条件检查的需要,您现在可以简单地删除 fib 方法的前两行。