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 :

Performance boucle for


Sujet :

Python

  1. #1
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 080
    Par défaut Performance boucle for
    Bonjour,

    j'essaye d'optimiser le filtre suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	def update(self,event,ctrl=False):
    		for elm in self[::-1]:
    			if elm.active and hasattr(elm,'update'):
    				if elm.update.__class__.__name__ == 'method':
    					ctrl = elm.update(event,ctrl)
    				elif elm.update.__class__.__name__ == 'function':
    					ctrl = elm.update(elm,event,ctrl)
    		return ctrl
    l'objet est une liste de 2000 éléments mais peu ont l'attribut active==True.
    la liste doit être parcourue en sens inverse, l'ordre doit être conservé.

    une idée ?

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 208
    Par défaut
    Hello,

    Pas trop le temps de l'analyse, mais mon réflexe serait de virer la copie self[::-1] par la méthode reversed().
    À tester pour voir si c'est mieux déjà
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 080
    Par défaut
    pas de gain significatif avec reversed, j'ai essayé plein de trucs, try/except, préfiltrage, sorted ... aucun gain, car il faut de toute façon parcourir au moins une fois la liste.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 208
    Par défaut
    Je veux bien les temps mesurés, ça n'a pas de sens que reversed ne soit pas meilleur... ou alors c'est qu'il y a si peu d'éléments que cette différence est négligeable.

    D'ailleurs 2000, c'est peu !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 080
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     
    reversed(self)
    15000/5000    1.967    0.000   18.732    0.004 elm.py:255(update)
     
    self[::-1]
    15000/5000    2.186    0.000   19.117    0.004 elm.py:255(update)

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 208
    Par défaut
    Si la boucle parcourt inutilement des milliers d'éléments inactifs, c'est un potentiel goulot d'étranglement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def update(self, event, ctrl=False):
        active_elms = [elm for elm in self if elm.active and hasattr(elm, 'update')]
     
     
        for elm in reversed(active_elms):
            if elm.update.__class__.__name__ == 'method':
                ctrl = elm.update(event, ctrl)
            elif elm.update.__class__.__name__ == 'function':
                ctrl = elm.update(elm, event, ctrl)
        return ctrl
    Je suppose que tu as déjà testé, mais sait-on jamais
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 080
    Par défaut
    oui déjà essayé, c'est très léger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    15000/5000    1.850    0.000   18.503    0.004 elm.py:264(update)

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 208
    Par défaut
    Il faudrait arrêter de recalculer la liste des éléments actifs à chaque fois et la maintenir à jour en permanence.

    Je crois qu'on appelle cela une solution "avec état" (stateful), mais même dans ce cas le gain sera sans doute pas énorme.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 325
    Par défaut
    bonjour

    pourquoi vouloir optimiser une boucle classique si ton algo est mauvais ou ta function "update" est longue ?

    Imagine que ta fonction update() prenne 99% du temps, aucun intéret de vouloir changer ta boucle...
    Mais, faut-il absolument calculer "ctrl" a chaque itération bonne ? pour au final ne retourner que le dernier

    "update" est une méthode/fonction récursive , il me semble ou tu utilises le même nom mais pour 2 fonctions bien différentes ???
    $moi= (:nono: !== :oops:) ? :king: : :triste: ;

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 080
    Par défaut
    En effet, mais il faudrait surcharger tout un tas de méthodes pour maintenir une "vue" de la liste. Beaucoup de travail pour de rares cas où la liste sera "longue".

    Merci d'avoir répondu

    update est récursif effectivement, ctrl est passé d'appel en appel avec possible modification, le dernier état est retenu. Possible qu'il y ait un autres goulot dans mon code ...

Discussions similaires

  1. Performance boucle for
    Par lg_53 dans le forum Général Python
    Réponses: 3
    Dernier message: 03/09/2019, 09h16
  2. Performance boucle for
    Par Pfeffer dans le forum C#
    Réponses: 5
    Dernier message: 15/12/2018, 08h57
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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