对于Python 3,是否有可能在特定时间跨度内找到函数中可能的最高计算数? 例如,如果某些东西几乎“永远”,有没有办法找出在1分钟内计算出的最高数量?
以下是代码:
def fibonacci5(n):
f1, f2 = 1, 0
while n > 0:
f1, f2 = f1 + f2, f1
n -= 1
return f2
我正在尝试使用可能的解决方案来找到通过timeit获得1秒的数字。
repeats = 10
t = timeit.Timer("fibonacci5(500000)", globals=globals())
time = t.timeit(repeats)
print ("average execution time:", time/repeats)
但500.000平均为2,6s,而250.000平均为0,6s - 因此该解决方案无效。
答案 0 :(得分:2)
您可以为您的函数添加一个计时器,使其在给定时间后停止:
from datetime import datetime, timedelta
max_runtime = timedelta(seconds=1)
def fibonacci5(n):
stop_time = datetime.now() + max_runtime
f1, f2 = 1, 0
while n > 0:
f1, f2 = f1 + f2, f1
n -= 1
if datetime.now() > stop_time:
return f2, 'timelimit reached'
return f2
请注意,如果它在时间用完后返回,它将不仅返回一个数字,而是一个带有数字和字符串'timelimit reached'
的元组。这样你可以区分正常终止和超时(可能有更好的方法来处理......)。
这里需要注意的是if
行(至少只要你的int
仍然非常小)可能是占用大部分时间的函数行。因此,结果不能完全代表实际的运行时间......
还要注意,有方式更有效的方法来计算斐波纳契数。
答案 1 :(得分:1)
如果我们写像
这样的Fibonacci序列生成器500000
它看起来很幼稚但工作得足够快,例如如果您需要itertools.islice
斐波纳契数,我们可以使用from itertools import islice
fibonacci_500000 = next(islice(fibonacci(), 500000, 500001))
print(fibonacci_500000)
47821988144175...more digits here...2756008390626
我的旧机器花了大约5秒钟,输出太大而无法插入,但看起来像
timedelta
但是如果您确实需要找出我们在一段时间后计算出的值,我们可以使用datetime
和from datetime import datetime, timedelta
def fibonacci():
a, b = 0, 1
while True:
yield b
a, b = b, a + b
if __name__ == '__main__':
duration = timedelta(seconds=5)
fibonacci_numbers = fibonacci()
stop = datetime.now() + duration
for index, number in enumerate(fibonacci_numbers, start=1):
if datetime.now() >= stop:
break
print(index)
个对象,例如
505352
它给我们在约5秒后计算的number
斐波纳契数(我们也可以打印{{1}},但它太长了)