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 :

Un code trop lent [Python 3.X]


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Un code trop lent
    Bonsoir,

    J'ai une petite question. A priori mon code est trop lent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import sys
    phrase=(sys.stdin.readline()).upper()
    compteur=[0]*26
    for lettre in phrase:
       if lettre!=" " and lettre!="\n":   
          c=phrase.count(lettre)
          compteur[ord(lettre)-65]=c
    sys.stdout.write(chr(compteur.index(max(compteur))+65))
    J'aimerais savoir qu'est ce qui rend mon code si lent. Est-ce le "for in " ? Mais comment m'en passer ?

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Qu'appelle-tu lent ? Chez moi c'est instantané.

    Je l'ai testé avec un long texte pour voir:

    Python 2 & 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # -*- coding: utf-8 -*-
    import sys
    with open('When_to_use_assert', 'r') as inf:
        txt = inf.read().upper()
    #phrase=(sys.stdin.readline()).upper()
    print(len(txt))  # 8626 caractères
    compteur = [0] * 50
    for lettre in txt:
       if lettre !=" " and lettre != "\n":   
          c = txt.count(lettre)
          compteur[ord(lettre)-65] = c
    sys.stdout.write(chr(compteur.index(max(compteur))+65))
    print()
    Pas la peine de mettre de chrono, c'est instantané.


    Par contre, si tu utilisais un dictionnaire, tu pourrais éviter de recompter les lettres autant de fois qu'elles apparaissent.
    Je suppose que tu réalises que, avec ton code, si la lettre "E" existe 25 fois dans le texte, tu exécutera 25 fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          c = txt.count("E")

  3. #3
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour,

    Citation Envoyé par VinsS Voir le message
    Qu'appelle-tu lent ? Chez moi c'est instantané.
    ...
    Par contre, si tu utilisais un dictionnaire, tu pourrais éviter de recompter les lettres autant de fois qu'elles apparaissent.
    D'accord avec tout. Le dictionnaire permet, en plus, de ne pas se limiter aux seules lettres de l'alphabet (alors qu'avec une liste, passage par ord pour avoir des indices allant, gentiment de 0 à 25).

    Il y a aussi collections.Counter qui fait ça tout seul (mais qui semble un peu plus lent).

    Dans tous les cas, reste à traiter les cas où plusieurs lettres/caractères ont le même nombre max d'occurrences

    EDIT : dans l'absolu, avec une liste, on peut aussi ne traiter qu'une seule fois une lettre trouvée mais c'est un peu sport et un peu bidouille. On lance la méthode count ssi, dans le compteur, pour cette lettre, la valeur mémorisée est nulle (donc pas encore mise à jour). Mais ça reste très lourdingue.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Merci de votre aide !

    Je vais essayer avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import sys
    phrase=(sys.stdin.readline()).upper()
     
    Alphabet = {"A":0, "B":0, "C":0,"D":0, "E":0, "F":0,
                "G":0, "H":0, "I":0,"J":0, "K":0, "L":0,
                "M":0, "N":0, "O":0,"P":0, "Q":0, "R":0,
                "S":0, "T":0, "U":0,"V":0, "W":0, "X":0,
                "Y":0, "Z":0}
     
    for lettre in Alphabet.keys():     
          Alphabet[lettre]=phrase.count(lettre)
     
    sys.stdout.write((max(Alphabet.items(), key=lambda t: t[1]))[0])
    Bon, ça marche !

    Merci

  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
    A priori mon code est trop lent
    C'est une façon de voir les choses, mais dire cela sans avoir les tests de performance (temps à l'appui), sans avoir le texte sur lequel c'est testé, et sans avoir les informations sur le processeur/RAM, cette affirmation semble subjective.

    D'ailleurs Counter doit/devrait être plus rapide que la méthode count car à ce que j'ai pu comprendre, le fichier texte semble être assez lourd, ce qui rend la méthode count hors concours à côté de Counter.

    Tant qu'on a pas plus d'informations,difficile de dire quoi que se soit.
    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. Optimisation code trop lent
    Par Pynouz dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/02/2013, 14h44
  2. code trop lent
    Par dmoluc dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 17/12/2012, 18h16
  3. Code trop lent à optimiser
    Par deuche dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/10/2011, 16h18
  4. Code trop lent: recuperation de donnees dans un autre classeur
    Par nianko dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/01/2010, 10h43
  5. [Eclipse] Editeur de code trop lent
    Par Benzeghiba dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 10/11/2005, 14h02

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