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

问题描述 投票:0回答:1

我正在练习python中的Fibonacci序列生成,并遵循How do I print a fibonacci sequence to the nth number in Python?的memoization示例。

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

他们不应该是一样的吗?

Without 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

With one-liner return

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

题 他们不应该是一样的吗? 为什么返回单行程比另一行慢得多? 我们可以用不同的措辞写一行代码,以便同样快速吗?

python
1个回答
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))

除了学习memoize如何工作之外,你应该考虑使用functools lru_cache's memoize,它是“用C语言编写的,并且比你在Python中可以重现的任何东西都要快得多”。

帽子提示meowgoesthedog,chepner和FHTMitchell。

© www.soinside.com 2019 - 2024. All rights reserved.