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 :

reversed ou [::-1]


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut reversed ou [::-1]
    Bonjour

    Tout est dans le titre. Soit une liste "liste" qu'on désire traiter à l'envers. Y a-t-il une utilité d'utiliser reversed(liste) alors qu'on a liste[::-1] ???
    Surtout que reversed() n'est qu'un générateur. Donc si on veut traiter la liste inversée d'un bloc, il faudra écrire [x for x in reversed(liste)] c'est à dire établir une seconde liste à partir du générateur alors que liste[::-1] est déjà une liste toute faite et donc semble plus indiquée...

    Je me suis posé la question suite à cette discussion dans laquelle j'ai vu quelqu'un proposer liste [::-1] et où ma solution basée sur reverse() était plus lourde.

    Merci de votre concours.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Question intéressante!

    Un petit test de rapidité (Python 2.7):

    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
    import random
    random.seed()
    import time
     
    n = 1000
    liste = [random.randint(0, 1000000) for i in xrange(0, n)]
     
    m = 1000000
    t1 = time.clock()
    for i in xrange(0, m):
        liste1 = list(reversed(liste))
    t1 = time.clock()-t1
    print t1
     
    t2 = time.clock()
    for i in xrange(0, m):
        liste2 = liste[::-1]
    t2 = time.clock()-t2
    print t2
     
    t3 = time.clock()
    for i in xrange(0, m):
        liste3 = [elem for elem in reversed(liste)]
    t3 = time.clock()-t3
    print t3
    Résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    8.7287309896
    2.59176160548
    56.2658522154
    On pourrait, bien sûr, essayer différentes configurations n et m pour vérifier si l'une des solutions s'améliore avec la taille de la liste par exemple.

    Conclusion:
    - le meilleur, c'est liste[::-1]
    - après, c'est list(reversed(liste)): 2 à 5 fois moins rapide
    - mais le plus mauvais, et de loin, c'est: [elem for elem in reversed(liste)]

    En fait, on n'a pas toujours le choix: reversed a l'avantage de renvoyer les éléments un par un, et quelquefois, c'est de ça dont on a besoin.
    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

  3. #3
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Tu parles en terme de vitesse(donc performance) mais ceci s'appliquerait bien en effet si on manipule un grand fichier .L'option avec reversed() donne un code condensé , mais on a parfois comme tu l'as dit pas le choix (si on trouve rien d'autres comme solution) .
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Un petit test de rapidité (Python 2.7):...

    Conclusion:
    - le meilleur, c'est liste[::-1]
    - après, c'est list(reversed(liste)): 2 à 5 fois moins rapide
    - mais le plus mauvais, et de loin, c'est: [elem for elem in reversed(liste)]
    Excellent
    Et en plus j'ai découvert time.clock()

    J'adore ce forum

    Fort de ton aide (surtout sur le 3° essai), je viens de reprendre 400 sources et j'ai checké partout où j'écrivais [for ... in ...] (heureusement "vi" a des regex de folie pour ce genre de recherche) pour regarder si parfois ça pouvait s'écrire list(...) et j'en ai trouvé quelques uns

    Citation Envoyé par tyrtamos Voir le message
    En fait, on n'a pas toujours le choix: reversed a l'avantage de renvoyer les éléments un par un, et quelquefois, c'est de ça dont on a besoin.
    Comme un générateur - Si on n'a pas besoin d'avoir forcément la liste entière en mémoire à cet endroit là...
    Merci à tous
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Celle-ci devrait être pas mal non plus je pense...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def test(myList):
        for i in xrange(len(myList), -1, -1):
            yield myList[i]
    À voir

    EDIT: C'est tout vu! c'est fin pourri

    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
    from time import clock
    from random import randint
     
    def displayTime(func):
        res = "Fonction {name}: {time} secondes"
        def wrap(varList):
            start = clock()
            for i in xrange(1000000):
                func(varList)
            t = clock() - start
            print res.format(name=func.__name__, time=t)
        return wrap
     
    def execute(iterable, *func):
        for f in func:
            yield f(iterable)
     
    @displayTime
    def test_1(myList):
        return myList[::-1]
     
    @displayTime
    def test_2(myList):
        return list(reversed(myList))
     
    @displayTime
    def test_3(myList):
        def wrp():
            for i in xrange(len(myList)-1, -1, -1):
                yield myList[i]
        return list(wrp())
     
    myList = [randint(0, 1000000) for i in xrange(1000)]
     
    test_3(myList)
    test_2(myList)
    test_1(myList)
    Résultats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fred1599@fred1599-Aspire-5741G:~$ python test.py
    Fonction test_3: 121.73 secondes
    Fonction test_2: 19.6 secondes
    Fonction test_1: 7.96 secondes
    Par contre si j'utilise que le générateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @displayTime
    def test_4(myList):
        for i in xrange(len(myList)-1, -1, -1):
            yield myList[i]
    On cartonne tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fred1599@fred1599-Aspire-5741G:~$ python test.py
    Fonction test_4: 0.57 secondes
    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)

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

Discussions similaires

  1. Est-il possible de bloquer le reverse engineering ?
    Par fugi dans le forum Assembleur
    Réponses: 39
    Dernier message: 31/07/2007, 02h33
  2. [Méthode travail] "Reverse Règles Métier"
    Par Eowyn dans le forum Méthodes
    Réponses: 4
    Dernier message: 15/12/2004, 13h39
  3. Reverse ingeniering c#
    Par Doulbousiouf dans le forum Rational
    Réponses: 2
    Dernier message: 18/10/2004, 14h35
  4. reverse engineering en C#
    Par Bouboubou dans le forum Rational
    Réponses: 3
    Dernier message: 07/10/2004, 10h28
  5. [bioinfo] reverse complementaire d'une sequence
    Par perlgirl dans le forum Bioinformatique
    Réponses: 6
    Dernier message: 18/06/2004, 11h22

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