在特定时间范围内找到最高可能的数字?

时间:2017-06-18 12:43:41

标签: python python-3.x time max

对于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 - 因此该解决方案无效。

2 个答案:

答案 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

但是如果您确实需要找出我们在一段时间后计算出的值,我们可以使用datetimefrom 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}},但它太长了)