您可以將計算斐波那契數列的程式最佳化到什麼程度?

王林
發布: 2024-08-21 15:21:33
原創
541 人瀏覽過

您可以將計算斐波那契數列的程式最佳化到什麼程度?

介紹

我學Python的時候,老師給我們佈置了一個作業-計算斐波那契數列的第N個數。

我覺得很簡單,所以我寫了這段程式碼:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
登入後複製

後來我知道這種解決方案太花時間了。

優化程式

我將解決方案更改為迭代。

def fib(n):
    ls = [1,1]
    for i in range(2,n):
        ls.append(ls[i-1]+ls[i-2])

    return ls[n-1]
登入後複製

我使用matplotlib繪製它花費的時間:

import time
import matplotlib.pyplot as plt


def bench_mark(func, *args):
    # calculate the time
    start = time.perf_counter()
    result = func(*args)
    end = time.perf_counter()

    return end - start, result  # return the time and the result

def fib(n):
    ls = [1,1]
    for i in range(2,n):
        ls.append(ls[i-1]+ls[i-2])

    return ls[n-1]

mark_list = []

for i in range(1,10000):
    mark = bench_mark(fib,i)
    mark_list.append(mark[0])
    print(f"size : {i} , time : {mark[0]}")

plt.plot(range(1, 10000), mark_list)
plt.xlabel('Input Size')
plt.ylabel('Execution Time (seconds)')
plt.title('Test fot fibonacci')
plt.grid(True)
plt.show()

登入後複製

結果在這裡:

How Far You Can Optimize a Program to Compute the Fibonacci Sequence?

花費的時間很短。

但是我寫了 fib(300000),花了 5.719049899998936 秒。太長了。

長大後,我學會了CACHE,所以我改變解決方案,使用dict來儲存結果。

from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

登入後複製

或者我們可以自己寫CACHE。

def fib(n, cache={}):
    if n in cache:
        return cache[n]
    elif n < 2:
        return 1
    else:
        ls = [1, 1]
        for i in range(2, n):
            next_value = ls[-1] + ls[-2]
            ls.append(next_value)
            cache[i] = next_value
        cache[n-1] = ls[-1]
        return ls[-1]
登入後複製

以上是您可以將計算斐波那契數列的程式最佳化到什麼程度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!