Python返回oneliner的行为不同于multiple liner

2024-05-11 17:29:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在练习用python生成Fibonacci序列,并遵循How do I print a fibonacci sequence to the nth number in Python?的记忆化示例。你知道吗

然后我遇到了一个有趣的区别,使用returnone liner和not。例如,下面给出了示例代码。在第一个示例中,我们不使用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

问题
他们不应该是一样的吗?
为什么一个班轮的回程比另一个班轮慢得多?
我们能用不同的词写一行吗?这样它同样快?你知道吗


Tags: in示例returnifdefnotoneelse
1条回答
网友
1楼 · 发布于 2024-05-11 17:29:20

这个

    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'smemoize,它是“用C编写的,比用Python复制的任何东西都要快得多。”

给meowgoesthedog、chepner和FHTMitchell的帽子小费。你知道吗

相关问题 更多 >