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

ast*_*123 0 python

我正在练习用python生成斐波那契序列,以及以下如何Python中打印斐波那契序列到第n个数字的记忆示例:。

然后我遇到了一个有趣的区别,那就是使用返回单线而不是返回单线。例如,下面给出示例代码。在第一个示例中,我们不使用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
Run Code Online (Sandbox Code Playgroud)

一线回程

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
Run Code Online (Sandbox Code Playgroud)

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

Sco*_*les 5

这个

    if n not in memo:
        memo[n] = func(n)
    return memo[n]
Run Code Online (Sandbox Code Playgroud)

与...不同

    return func(n) if n not in memo else memo[n]
Run Code Online (Sandbox Code Playgroud)

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

    if n not in memo:
        return func(n)
    return memo[n]
Run Code Online (Sandbox Code Playgroud)

为了优化一个衬板并保存字典值,您应该将一个衬板更改为:

    return memo[n] if n in memo else memo.setdefault(n, func(n))
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Barmar 这是蟒蛇。不鼓励积极降低行数。 (2认同)