Une méthode à calculer une seule fois (@lazy function ??)
5 réponses
Laurent Claessens
Bonjour tout le monde
J'ai une classe qui a une méthode qui demande un calcul assez lourd.
Pour une instance donnée, je suis certain que la résultat ne va jamais
changer.
Seulement, pour certaines instances je n'ai pas besoin d'utiliser
cette méthode, et pour d'autres, j'aurai besoin de l'utiliser plusieurs
fois.
Donc je veux une méthode qui n'est, par défaut pas calculée, (donc
pas à calculer dans __init__). Mais je veux que si je l'appelle deux
fois, la seconde fois se contente de retourner le même résultat.
y=MyClass(2)
print y.hard_computation()
print y.hard_computation() # 2+1 is computed only once !
---------------------------------------------------------
Pour la classe MyClass, le calcul sera effectué à chaque appel de
hard_computation(). Pour la classe MyOptimizedClass, le calcul sera
uniquement effectué la première fois.
Question : est-ce que procéder comme cela est conseillé ?
Il me semble me souvenir de quelque chose comme @lazy_function à mettre
devant def hard_computation(self), mais je n'ai pas retrouvé. Est-ce que
quelqu'un sait ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Laurent Claessens
Il me semble me souvenir de quelque chose comme @lazy_function à mettre devant def hard_computation(self), mais je n'ai pas retrouvé. Est-ce que quelqu'un sait ?
Je me réponds (partiellement) à moi-même. Ce dont je me souvenais était @lazy_attribute dans Sage : http://www.sagemath.org/doc/reference/sage/misc/lazy_attribute.html
Est-ce que cela existe aussi en python "pur" ?
Bon WE Laurent
Il me semble me souvenir de quelque chose comme @lazy_function à mettre
devant def hard_computation(self), mais je n'ai pas retrouvé. Est-ce que
quelqu'un sait ?
Je me réponds (partiellement) à moi-même. Ce dont je me souvenais était
@lazy_attribute
dans Sage :
http://www.sagemath.org/doc/reference/sage/misc/lazy_attribute.html
Il me semble me souvenir de quelque chose comme @lazy_function à mettre devant def hard_computation(self), mais je n'ai pas retrouvé. Est-ce que quelqu'un sait ?
Je me réponds (partiellement) à moi-même. Ce dont je me souvenais était @lazy_attribute dans Sage : http://www.sagemath.org/doc/reference/sage/misc/lazy_attribute.html
Est-ce que cela existe aussi en python "pur" ?
Bon WE Laurent
Philippe Bouige
Le 05-02-2011, Laurent Claessens a écrit :
Bonjour tout le monde
J'ai une classe qui a une méthode qui demande un calcul assez lourd. Pour une instance donnée, je suis certain que la résultat ne va jamais changer.
memoize(function): cache = {} def decorated_function(*args): if args in cache: return cache[args] else: val = function(*args) cache[args] = val return val return decorated_function
cette méthode, et pour d'autres, j'aurai besoin de l'utiliser plusieurs fois. Donc je veux une méthode qui n'est, par défaut pas calculée, (donc pas à calculer dans __init__). Mais je veux que si je l'appelle deux fois, la seconde fois se contente de retourner le même résultat.
y=MyClass(2) print y.hard_computation() print y.hard_computation() # 2+1 is computed only once !
--------------------------------------------------------- Pour la classe MyClass, le calcul sera effectué à chaque appel de hard_computation(). Pour la classe MyOptimizedClass, le calcul sera uniquement effectué la première fois.
Question : est-ce que procéder comme cela est conseillé ? Il me semble me souvenir de quelque chose comme @lazy_function à mettre devant def hard_computation(self), mais je n'ai pas retrouvé. Est-ce que quelqu'un sait ?
Bon WE Laurent
Le 05-02-2011, Laurent Claessens <moky.math@gmail.com> a écrit :
Bonjour tout le monde
J'ai une classe qui a une méthode qui demande un calcul assez lourd.
Pour une instance donnée, je suis certain que la résultat ne va jamais
changer.
memoize(function):
cache = {}
def decorated_function(*args):
if args in cache:
return cache[args]
else:
val = function(*args)
cache[args] = val
return val
return decorated_function
cette méthode, et pour d'autres, j'aurai besoin de l'utiliser plusieurs
fois.
Donc je veux une méthode qui n'est, par défaut pas calculée, (donc
pas à calculer dans __init__). Mais je veux que si je l'appelle deux
fois, la seconde fois se contente de retourner le même résultat.
y=MyClass(2)
print y.hard_computation()
print y.hard_computation() # 2+1 is computed only once !
---------------------------------------------------------
Pour la classe MyClass, le calcul sera effectué à chaque appel de
hard_computation(). Pour la classe MyOptimizedClass, le calcul sera
uniquement effectué la première fois.
Question : est-ce que procéder comme cela est conseillé ?
Il me semble me souvenir de quelque chose comme @lazy_function à mettre
devant def hard_computation(self), mais je n'ai pas retrouvé. Est-ce que
quelqu'un sait ?
memoize(function): cache = {} def decorated_function(*args): if args in cache: return cache[args] else: val = function(*args) cache[args] = val return val return decorated_function
cette méthode, et pour d'autres, j'aurai besoin de l'utiliser plusieurs fois. Donc je veux une méthode qui n'est, par défaut pas calculée, (donc pas à calculer dans __init__). Mais je veux que si je l'appelle deux fois, la seconde fois se contente de retourner le même résultat.
y=MyClass(2) print y.hard_computation() print y.hard_computation() # 2+1 is computed only once !
--------------------------------------------------------- Pour la classe MyClass, le calcul sera effectué à chaque appel de hard_computation(). Pour la classe MyOptimizedClass, le calcul sera uniquement effectué la première fois.
Question : est-ce que procéder comme cela est conseillé ? Il me semble me souvenir de quelque chose comme @lazy_function à mettre devant def hard_computation(self), mais je n'ai pas retrouvé. Est-ce que quelqu'un sait ?
Oui, c'est exactement ce genre de choses que je cherchais. Maintenant je sais surtout que je dois chercher à comprendre ce que sont les "décorateurs" de fonctions. C'est au programme de la prochaine fois que j'aurai du temps à y consacrer ;) En attendant je vais utiliser plus ou moins tel quel sans chercher à comprendre.
Oui, c'est exactement ce genre de choses que je cherchais.
Maintenant je sais surtout que je dois chercher à comprendre ce que sont
les "décorateurs" de fonctions.
C'est au programme de la prochaine fois que j'aurai du temps à y
consacrer ;)
En attendant je vais utiliser plus ou moins tel quel sans chercher à
comprendre.
Oui, c'est exactement ce genre de choses que je cherchais. Maintenant je sais surtout que je dois chercher à comprendre ce que sont les "décorateurs" de fonctions. C'est au programme de la prochaine fois que j'aurai du temps à y consacrer ;) En attendant je vais utiliser plus ou moins tel quel sans chercher à comprendre.