这些memoization实现之间有什么区别(如果存在)?是否有一个用例比另一个更好? (我将此Fibo
递归作为示例包含在内)
换句话说:检查if some_value in self.memo:
和if some_value not in self.memo:
之间是否存在差异,如果是,是否存在更好的实施方案(更好地针对性能进行优化等)?< / p>
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
答案 0 :(得分:2)
这些实现中没有显着的性能差异。在我看来,fib2
是一个更具可读性/ pythonic的实现,应该是首选。
我要做的另一个建议是在__init__
中初始化备忘录,如下所示:
self.memo = {0:0, 1:1}
这避免了在每次调用中进行条件检查的需要,您现在可以简单地删除fib
方法的前两行。