Merci à l'auteur de ce morceau de code, voilà une fonction efficiente pour calculer le Nième nombre de la suite de Fibonacci.

from math import floor, log

def fib(n):
    if n == 0:
        return 0
    elif n in (1, 2):
        return 1
        
    F = 1
    L = 1
    sign = -1
    mask = 2 ** (int(floor(log(n, 2)))-1)
    for i in range(1, int(floor(log(n, 2)))):
        temp = F ** 2
        F = (F + L) / 2
        F = 2 * F ** 2 - 3 * temp - 2 * sign
        L = 5 * temp + 2 * sign
        sign = 1
        if n & mask:
            temp = F
            F = (F + L) / 2
            L = F + 2 * temp
            sign = -1
        mask = mask / 2
    if n & mask == 0:
        F = F * L
    else:
        F = (F + L) / 2
        F = F * L - sign
    
    return F

Source : Pure Python Fibonacci Numbers.