【问题标题】:How can I optimise below Python code to run faster? [duplicate]如何优化下面的 Python 代码以更快地运行? [复制]
【发布时间】:2021-08-05 07:28:48
【问题描述】:

这是返回两个连续数的斐波那契数列的代码,其乘积在fib() 函数中传递。如果产品超过给定的数字,代码将返回这两个数字和list 中的False,如图所示。

这需要大量时间来运行更大的数字。 有人可以帮我优化这段代码吗?

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


def productFib(prod):           
    i = 0
    while i >= 0:
        a = fib(i)*fib(i+1)
        if a == prod:
            return [fib(i), fib(i+1), True]
        elif a > prod:
            return [fib(i), fib(i+1), False]
        i+=1
    
        
print(productFib(41)) # [8, 13, False]
print(productFib(40)) # [5, 8, True]
print(productFib(4895)) # [55, 89, True]
print(productFib(5895)) # [89, 144, False]

斐波那契数列:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ... .

【问题讨论】:

标签: python python-3.x fibonacci


【解决方案1】:

您的 fiboncci 函数非常慢,因为您一次又一次地进行相同的计算。这是一个众所周知的问题,要解决这个问题,您可以使用迭代方法或使用memoization。幸运的是,您不需要为它编写代码。 Python 通过lru_cache 内置了对缓存函数的支持。

from functools import lru_cache

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

【讨论】:

  • 这应该是公认的答案,因为这是一个特定于 Python 的解决方案。对于这个任务来说,自动滚动记忆似乎很荒谬,所以我特别欣赏这个答案的简单性和直接性。
【解决方案2】:

查看您的代码,我唯一能想到的就是避免在返回结果时再次调用该函数并预先存储斐波那契变量。

def productFib(prod):           
    i = 0
    while i >= 0:
        fib_curr = fib(i)
        fib_next = fib(i+1)
        a = fib_curr * fib_next
        if a == prod:
            return [fib_curr, fib_next, True]
        elif a > prod:
            return [fib_curr, fib_next, False]
        i+=1

如果您计划针对不同的值多次运行代码,例如您已经给出了print 状态的示例,您可以通过将斐波那契值存储在列表中达到一定数量来优化它,然后遍历列出直到找到匹配项,通过这种方法至少您的代码不必重复计算相同的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2011-06-25
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多