2017-06-18 19 views
0

對於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

這完全取決於算法是什麼。我們需要更多的背景。 – Carcigenicate

+0

在這種情況下,它用於計算斐波納契數。 –

+0

那麼,斐波那契數列是無窮afaik,所以任何曾經寫過的斐波那契函數都需要在序列結束前停下來的能力。你是否查找過斐波那契函數的實現? – Carcigenicate

回答

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 s仍然非常小)可能是佔用最多時間的函數的行......結果將不代表實際運行時間非常準確...

還注意到有方式更有效的方式來計算斐波納契數字。

+0

這對於在需要很長時間之前可以走多遠有一個粗略估計是非常有用的。謝謝! –

1

如果我們寫的斐波那契序列發生器一樣

def fibonacci(): 
    a, b = 0, 1 
    while True: 
     yield b 
     a, b = b, a + b 

它看起來幼稚,但是工作速度不夠快,例如如果你需要500000個斐波那契數,我們可以使用itertools.islice

from itertools import islice 

fibonacci_500000 = next(islice(fibonacci(), 500000, 500001)) 
print(fibonacci_500000) 

歷時約5秒鐘,我的老機器,產量太大而無法插入,但它看起來像

47821988144175...more digits here...2756008390626 

但如果你真的需要找出哪些價值,我們已經一段時間後計算出的 - 我們可以使用timedeltadatetime對象像

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次計算大約5秒後的斐波那契數(我們也可以打印number,但它太長了)

+0

事情是我不需要數字本身,我需要找出最大之前,計算需要太長時間:) –

+0

@TheOnlyRaichuu:編輯,加時間 –

相關問題