"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Até que ponto você pode otimizar um programa para calcular a sequência de Fibonacci?

Até que ponto você pode otimizar um programa para calcular a sequência de Fibonacci?

Publicado em 23/08/2024
Navegar:658

Até que ponto você pode otimizar um programa para calcular a sequência de Fibonacci?

Introdução

Quando eu estava aprendendo Python, nosso professor nos deu uma lição de casa - calcular o enésimo número da sequência de Fibonacci.

Acho que é muito fácil, então escrevo este código:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n - 1)   fib(n - 2)

Mais tarde, sei que esse tipo de solução custa muito tempo.

Otimize um programa

Eu mudo a solução para iteração.

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

    return ls[n-1]

Eu uso o matplotlib para desenhar o tempo que custou:

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

Resultado aqui:

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

O tempo que custou é muito curto.

Mas eu escrevo mentira(300000), custou 5,719049899998936 segundos. Está muito comprido.

Quando eu crescer, aprendo CACHE, então mudo a solução para usar dict para armazenar o resultado.

from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
    if n 



Ou podemos escrever o CACHE sozinhos.

def fib(n, cache={}):
    if n in cache:
        return cache[n]
    elif n 




          

            
        
Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/mengqinyuan/how-far-can-you-optimize-a-program-to-compute-the-fibonacci-sequence-oa2?1 Se houver alguma violação, por favor entre em contato com study_golang@163 .comdelete
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3