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 :

Question c_. du jour sur uneList.pop


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Question c_. du jour sur uneList.pop
    Bonjour,
    en treme de rapidité d'exécution, vaut-il mieux faire uneListe = uneListe[:-1] ou bien uneListe = uneListe.pop(-1) ?

    Même question pour uneListe = uneListe[:-3] et for i in range(3): uneListe.pop(-1) .

  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
    bonjour,

    j'aurais tendance à dire que l'appel à pop est plus rapide. je me base sur le fait qu'une réaffectation de la liste va copier les valeurs en mémoire.

    c'est de l'intuition (et en général pour des questions d'optimisation, l'intuition c'est le mal) alors qu'un petit profile ou hotshot, voire même un petit time sur ce cas précis serait plus juste :p

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Petit test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from time import clock
     
    liste = [i for i in xrange(0, 10000)]
     
    t1 = clock()
    liste2 = liste[:-1]
    t1 = clock()-t1
     
    t2 = clock()
    liste3 = liste.pop(-1)
    t2 = clock()-t2
     
    print t1, t2, t2/t1
    Résultat: la solution pop est un peu plus lente.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci pour ces réponses. J'ai repris le test de tyrtamos sous Python 3 de la façon suivante :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #! /usr/bin/env python3
     
    from time import clock
     
    liste = [i for i in range(0, 10000000)]
     
    t1 = clock()
    liste2 = liste[:-1]
    t1 = clock()-t1
     
    liste3 = liste
    t2 = clock()
    liste3.pop(-1)
    t2 = clock()-t2
     
    print("---",
          "Même liste ?",
          liste2 == liste3,
          "Temps pour liste = liste[:-1]",
          t1,
          "Temps pour liste = liste.pop(-1)",
          t2,
          sep="\n")
     
    t1 = clock()
    liste2 = liste[:-1000]
    t1 = clock()-t1
     
    liste3 = liste[:]
    t2 = clock()
    for i in range(1000): liste3.pop(-1)
    t2 = clock()-t2
     
    print("---",
          "Même liste ?",
          liste2 == liste3,
          "Temps pour liste = liste[:-100]",
          t1,
          "Temps pour for i in range(100): liste.pop(-1)",
          t2,
          sep="\n")
     
     
    t1 = clock()
    liste2 = liste[:-9999999]
    t1 = clock()-t1
     
    liste3 = liste
    t2 = clock()
    for i in range(9999999): liste3.pop(-1)
    t2 = clock()-t2
     
    print("---",
          "Même liste ?",
          liste2 == liste3,
          "Temps pour liste = liste[:-9999999]",
          t1,
          "Temps pour for i in range(9999999): liste.pop(-1)",
          t2,
          sep="\n")
    J'obtiens :
    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
    ---
    Même liste ?
    True
    Temps pour liste = liste[:-1]
    0.18
    Temps pour liste = liste.pop(-1)
    0.0
    ---
    Même liste ?
    True
    Temps pour liste = liste[:-100]
    0.25
    Temps pour for i in range(100): liste.pop(-1)
    0.0
    ---
    Même liste ?
    True
    Temps pour liste = liste[:-9999999]
    0.09
    Temps pour for i in range(9999999): liste.pop(-1)
    4.77
    En fait, il faut regarder au cas par cas.

    L'intuition et les explications de kango semblent bonnes dans les cas usuels où on doit enlever quelques éléments en fin de liste. Mon expérience perso. a été confronté à ces cas là et non au cas particulier que j'ai exhibé dans le dernier test ci-dessus.

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

Discussions similaires

  1. Deux questions sur Firewall et mises à jour sur XP.
    Par Pierre GIRARD dans le forum Windows XP
    Réponses: 7
    Dernier message: 07/03/2013, 07h47
  2. Réponses: 4
    Dernier message: 11/07/2007, 16h23
  3. Question "pas si bête" sur le protocole SNMP
    Par arsenik7 dans le forum Développement
    Réponses: 3
    Dernier message: 02/01/2006, 11h49
  4. Calcul d'un nb de jours sur un état
    Par Mr White dans le forum Access
    Réponses: 12
    Dernier message: 30/10/2005, 17h54
  5. question (peut-être idiote) sur les vues
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/03/2003, 10h35

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