我如何才能将 Python 以下代码优化为更快 运行?
How can I optimise below Python code to run faster?
这是返回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, ... .
在查看您的代码时,我唯一能想到的就是避免在返回结果时再次调用该函数并预先存储斐波那契变量。
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
状态示例一样,您可以通过将斐波那契值存储在一个列表中来优化它一定数量,然后遍历列表直到找到匹配项,通过这种方法至少您的代码将不必重复计算相同的值。
您的 fiboncci 函数非常慢,因为您一次又一次地进行相同的计算。这是一个众所周知的问题,要解决这个问题,您可以使用迭代方法或使用 memoization. Fortunately, you don't need to write a code for it. Python has built in support for caching functions via 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)
这是返回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, ... .
在查看您的代码时,我唯一能想到的就是避免在返回结果时再次调用该函数并预先存储斐波那契变量。
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
状态示例一样,您可以通过将斐波那契值存储在一个列表中来优化它一定数量,然后遍历列表直到找到匹配项,通过这种方法至少您的代码将不必重复计算相同的值。
您的 fiboncci 函数非常慢,因为您一次又一次地进行相同的计算。这是一个众所周知的问题,要解决这个问题,您可以使用迭代方法或使用 memoization. Fortunately, you don't need to write a code for it. Python has built in support for caching functions via 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)