Solution simple et naïve pour un cache vraiment basique, puisqu'il ne permet pas d'être utilisé avec des fonctions à mots-clés qui ont tendance à se retrouver dans des dictionnaires, encore des trucs pas hashables :
def cache(fun):
cache = {}
def cake(*args):
try:
return cache[args]
# Si les arguments ont déjà été donnés une fois à la fonction,
# bah alors elle retournera la même chose. Sinon, elle pue.
except KeyError:
result = fun(*args)
cache[args] = result
return result
return cake
Petit avantage, il est rapide à coder, rapide à appeler le cache, et souvent suffisant pour les fonctions dans ce style.
Ce sont des décorateurs faciles à mettre en place et à modifier lorsqu'on veut déclencher une action à chaque fois qu'une fonction est appelée, c'est ça qui est bien.
Pour mon code précédent, une solution pour ne pas avoir l'inconvénient du cache qui ne peut pas prendre des keywords ou des arguments comprenant des dictionnaires ou des choses pas hashables, on peut remplacer le cache={} par une liste, mais il faut alors gérer la liste correctement (par exemple une liste du type [((args,kwargs),resultat),((args2,kwargs2),resultat)] et faire des recherches dedans, ce qui fait qu'on finit avec un truc de complexité O(n) en recherche et O(n) à l'insertion, au lieu de O(1) et O(1) avec un dictionnaire, ce qui est souvent plus rapide que la fonction cachée (sans intérêt sinon), mais peut sérieusement ralentir le tout quand même.
Merci, cette explication concise qui ne s’encombre pas de bla bla inutile m’a permis de comprendre très vite le fonctionnement des décorateurs (c’est ma première confrontation avec eux) et d’écrire très rapidement une solution pour l’exercice qui fonctionne pour les fonctions à un seul argument (ne connaissant pas bien Python, je ne sais pas manipuler les fonctions à nombre d’arguments variable).
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.