Jusqu'où pouvez-vous optimiser un programme pour calculer la séquence de Fibonacci ?

王林
Libérer: 2024-08-21 15:21:33
original
605 Les gens l'ont consulté

Jusqu’où pouvez-vous optimiser un programme pour calculer la séquence de Fibonacci ?

Introduction

Quand j'apprenais Python, notre professeur nous a donné un devoir : calculer le Nième nombre de la séquence de Fibonacci.

Je pense que c'est très simple, alors j'écris ce code :

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
Copier après la connexion

Plus tard, je sais que ce genre de solution coûte trop de temps.

Optimiser un programme

Je change la solution en itération.

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

    return ls[n-1]
Copier après la connexion

J'utilise matplotlib draw le temps que ça coûte :

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()

Copier après la connexion

Résultat ici :

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

Le temps que cela coûte est très court.

Mais j'écris fib(300000), cela coûte 5,719049899998936 secondes. C'est trop long.

Quand je serai grand, j'apprends CACHE, donc je change de solution pour utiliser dict pour stocker le résultat.

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)

Copier après la connexion

Ou nous pouvons écrire le CACHE par nous-mêmes.

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]
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!