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 :

List append performance


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Par défaut List append performance
    Bonjour

    N'étant pas un pro python, je cherche à comprendre une bizarrerie que je rencontre en Python v2.5.4.

    J'ai une liste (10000 éléments) de chaine de caractères que je parcours dans un for.
    Pour chaque chaine, je construis un objet qui est rajouté dans une autre liste.
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    results = []
    #
    for xml : xml_list:
         # create object from xml
         obj = createObject(xml)
         # append obj in result
         results.append(obj)                   <---- pb de perfo
    Mon pb vient du results.append qui prends 5s sur un total de 15s.
    Si je commente la ligne qui fait le append, mon traitement prends 10s.
    Je pensais que c'était le append qui prenait du temps mais si au lieu de faire un results.append(obj), je fais un results.append(xml), mon traitement continue de prendre 10s.
    Donc c'est bien le fait de rajouter "un objet complexe" dans ma liste qui prends du temps mais je ne sais pas pourquoi.

    Qu'un aurait une explication?

    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    voir la discussion
    votre code devrait marcher mieux avec les gc.disable/gc.enable ci dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import gc
    results = []
    #
    gc.disable()
    for xml : xml_list:
         # create object from xml
         obj = createObject(xml)
         # append obj in result
         results.append(obj)  
    gc.enable()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Par défaut
    Bonjour wiztricks

    Et merci pour ta réponse.
    J'ai essayé, je gagne une seconde de temps.

    Il me reste donc ces 4 secondes dans les bras

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Si ce n'est plus un problème connu Python 2.5, il faut peut être regarder l'utilisation de ressources comme RAM, IO disques, fichiers de pagination,...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    Vous avez essayé avec deque?

    Un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from collections import deque
    >>> liste = deque()
    >>> liste.append(5)
    >>> liste.append(12)
    >>> print liste
    deque([5, 12])

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    ... ou une list comprehension:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    results = [createObject(xml) for xml in xmlList]
    Si la liste de résultats n'est utilisée que de façon séquentielle, on peut même éviter de créer la liste et utiliser une generator expression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    results = (createObject(xml) for xml in xmlList)

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

Discussions similaires

  1. Maps, Lists et performances
    Par atmakefka dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 23/07/2010, 10h59
  2. Réponses: 4
    Dernier message: 30/01/2009, 15h20
  3. Performances avec des listes d'objets
    Par metalcoyote dans le forum Langage
    Réponses: 9
    Dernier message: 20/05/2008, 11h11
  4. [Performance] Différence entre List<T> et Collection<T>
    Par simone.51 dans le forum Framework .NET
    Réponses: 3
    Dernier message: 14/04/2008, 12h19
  5. Réponses: 3
    Dernier message: 25/04/2007, 09h45

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