IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Optimisation de surcharge d'operateurs de class


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut Optimisation de surcharge d'operateurs de class
    Après avoir écrit quelques uns de mes opérateurs pour certaines classes, je me pose la question de savoir si je n'ai pas écris une usine à gas.
    A savoir que ces opérateurs vont être utilisé par PyQT car se sont les opérateur d'un DataModel, et donc appelé vaaaaaaaaaachement souvent.

    Voici la facon dont je les écrit aujourd'hui:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def __eq__(self, other):
        if isinstance(other, int):
            return self.revision() == other
        else:
            return self.revision() == other.revision()
    En fait j'ai un peu peur que isinstance() soit légèrement... prohibitif en terme de temps d'exécution

    Limite je me demandais si passer sur quelque chose comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        return self.revision() == other.revision()
    except AttributError, e:
        return self.revision() == other
    ne serait pas plus efficace. Qu'en pensez vous ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonsoir,

    après avoir profilé un script j'ai été en effet assez surpris par le temps passé dans isinstance mais je ne peux pas dire que j'ai trouvé ça prohibitif.

    voici un petit example:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import time
     
    def title1(var):
     
        if type(var) is str:
            var=var.title()
        else:
            var="No title"
     
    def title2(var):
     
        if isinstance(var,str):
            var=var.title()
        else:
            var="No title"
     
    def title3(var):
     
        try: var=var.title()
        except AttributeError: var="No title"
     
    def main(f):
     
        print time.clock()
        for i in xrange(10000000):
            f("toto")
            f(3.14)
        print time.clock()
     
    if __name__ == "__main__":
     
        main(title1)
    l'utilisation de title1 prend 9.57sec.
    l'utilisation de title2 prend 10.57sec.
    l'utilisation de title3 prend 37.41sec.

    on aurait donc tendance à dire que le try est moins performant.

    maintenant si dans ma fonction main, je retire f(3.14):

    l'utilisation de title1 prend 6.43sec.
    l'utilisation de title2 prend 5.66sec.
    l'utilisation de title3 prend 4.36sec.

    là forcément le try est plus performant dans la mesure où on ne rentre jamais dans l'instruction except.

    il est marrant de constater que la tendance is/isinstance s'inverse. on dirait que isinstance est plus rapide si elle retourne "Vrai".

    donc je dirais que la réponse dépend du nombre de fois où dans ton cas other sera un int ou du même type que self.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    Merci pour les chiffres, kango, c'est vrai que je cherchais une réponse basée sur les algos des différentes méthodes et, suivant mon idée, je n'ai même pas pensé à faire des tests ==> Shame on me !

    En tout cas ton analyse m'aura permis de comprendre comment marche le isinstance. Je vais réfléchir à tout ça et voir si je dois changer mon code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 04/08/2013, 09h38
  2. Surcharge d'operateur pour une classe
    Par EvaristeGaloisBis dans le forum Débuter
    Réponses: 2
    Dernier message: 04/03/2013, 15h41
  3. Réponses: 4
    Dernier message: 27/10/2008, 17h53
  4. Réponses: 6
    Dernier message: 20/03/2007, 10h51
  5. [POO] Surcharge d'opérateurs []
    Par Amnesiak dans le forum Langage
    Réponses: 28
    Dernier message: 11/11/2005, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo