Tu devrais avoir un truc plutôt comme ça:
def fonction_super_lente(n, _resultats={}):
# bal bla bla
data = [fonction_super_lente(n) for n in range(10000)]
Au passage, depuis python3.2 il y a un cache dans la lib standard: functools.lru_cache. Dans quelques années ça sera être un standard, qui sait ? En attendant une version compatible pour python < 3.2 est là: http://code.activestate.com/recipes/578078-py26-and-py30-backport-of-python-33s-lru-cache/
]]>data = [fonction_super_lente(n, _resultats={}) for n in range(10000)]
J’ai mis en place ce système pour le module MSS, et il s’avère que ça a plombé le bousin.
Par contre, en déclarant resultats
juste avant la fonction, j’ai pu constater une amélioration flagrante.
Sinon, merci pour l’article ;)
]]>Ayant une vision supermanesque j’avais complètement oublié que les mortels que vous êtes ne pouvaient voir ce qui était écrit en dessous de ces merveilleux petits tampounets…
Pensez à faire un F5
]]>Penser à remplacer le “if” par un “if not” dans la version avec attribut. Sinon y’a pas que votre collègue qui va vous demander WTF, y’a l’interpréteur python aussi.
À part ça, les tampons, c’est top feng shui, mais des fois ça cache le texte. Peut-être que vous vous en êtes aperçus et que vous préférez le laisser comme ça, parce que ça fait artiste.
“Ouuaaaiis t’vois, l’important, c’est pas les caractères, mec. C’est ce qu’ils veulent dire au fond d’eux mêmes, t’vois.”
]]>Avant d’optimiser, faut bien mesurer le gain que l’on souhaite, et faire gaffe aux propriétés des fonctions que l’on cache.
Sinon, j’insiste beaker.cache c’est la solution costard, cravatte, canne et monocle. Ai je précisé que comme repoze.lru c’est thread safe? La seule différence entre repoze.lru et beaker.cache c’est pour beaker il y avait pas besoin de soumettre un patch pour qu’elle soit complète.
]]>Le commentaire de Marius Gedminas à lui tout seul est important.
]]>* memoize avec dict;
* memoize avec un dict à taille fixe mimine 1.0;
* repoze.lru (LRU) cache à taille fixe et éventuellement à temps d’expiration;
* beaker.cache (fait tout mémoire, disk, memcached, taille fixe…)
À le problème d’un mémoize c’est que si on rappelle la fonction souvent on peut pas vider le cache donc repoze.lru propose un fournisseur de cache nommé que l’on peut vider, qui a mon grand dam n’est pas documenté.
Si vous voulez le beurre l’argent du beurre, et marier la crémière je conseille beaker.cache.
]]>