【问题标题】:Difference between Memoization Implementations - Python记忆实现之间的区别 - Python
【发布时间】:2016-09-14 04:44:11
【问题描述】:

这些记忆化实现之间有什么区别(如果有的话)?是否存在一个比另一个更可取的用例? (我以 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

【问题讨论】:

  • innot in 应该需要大致相同的时间复杂度 - 检索是 O(1) 其中涉及的时间是散列键值,然后在底层散列表中查找散列.您可以随时尝试timeit 来确定。

标签: python python-2.7 memoization


【解决方案1】:

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

我要提出的另一个建议是像这样初始化__init__ 中的备忘录:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 2018-07-05
    • 2012-11-15
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多