Python返回单行代码的行为与多行代码不同

时间:2019-03-18 15:25:37

标签: python

我正在练习用Python生成斐波那契序列,并遵循How do I print a fibonacci sequence to the nth number in Python?中的记忆示例。

然后我遇到了一个有趣的区别,那就是使用返回单线而不是返回。例如,下面给出示例代码。在第一个示例中,我们不使用return one-liner并且运行非常快,但是,在第二个示例中,我们使用return one-liner并且运行非常慢。

他们应该不一样吗?

没有一线纸

def memoize(func):
    memo = dict()
    def decorated(n):
        if n not in memo:
            memo[n] = func(n)
        return memo[n]

    return decorated

@memoize
def fib(n):
    if n<=1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

print([ fib(i) for i in range(100,110)]) # runs very fast

单线返回

def memoize(func):
    memo = dict()
    def decorated(n):
        return func(n) if n not in memo else memo[n]

    return decorated

@memoize
def fib(n):
    if n<=1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

print([ fib(i) for i in range(100,110)]) # very slow

问题
他们应该不一样吗?
为什么返回一线比另一个线慢得多?
我们可以用不同的措词写一个班轮,以便它同样快吗?

1 个答案:

答案 0 :(得分:5)

    if n not in memo:
        memo[n] = func(n)
    return memo[n]

不同
    return func(n) if n not in memo else memo[n]

单线不修改备忘录的内容。如果您想将苹果与苹果进行比较,请尝试:

    if n not in memo:
        return func(n)
    return memo[n]

为优化一根衬纸并保存字典值,您应将一根衬纸更改为:

    return memo[n] if n in memo else memo.setdefault(n, func(n))

除了学习备忘录的工作原理之外,您还应该使用functools lru_cache's备忘录,它是“用C编写的,并且比用Python可以复制的东西要快得多。”

喵喵狗,chepner和FHTMitchell的帽子提示。