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 :

Comptage de lignes et affichage des résultats


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    manager
    Inscrit en
    Juin 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : manager

    Informations forums :
    Inscription : Juin 2007
    Messages : 44
    Points : 79
    Points
    79
    Par défaut Comptage de lignes et affichage des résultats
    Bonjour,

    Dans mes différents essais de retraitement de mes données, je cherchais une méthode pour déterminer rapidement le nombre de lignes à traiter, (de façon "pythonic")

    J'ai emprunté à Stackoverflow le programme suivant que j'ai complété des méthodes complémentaires proposées. Au final, j'aimerai afficher le nombre de lignes en face de chaque résultat des temps de traitements/fonction appelée.
    Pour information, c'est la fonction mapcount qui semble la plus performante (chez moi).
    Après différentes recherches, si j'arrive bien à afficher la fonction et le temps, ne n'arrive pas à afficher le nombre de lignes.

    J'ai ajouté une ligne du type : counts[func].append(nbLines) qui n'est vraisemblablement pas à la bonne place.

    Je suppose qu'il s’agit d'un dictionnaire ?
    Est-il préférable de créer une structure de type tuple pour afficher quelque chose comme row.function,row.nb, min(row.time), max(row.time), avg(row.time)

    Avez vous une idée qui puisse m'éclairer.

    Le programme est proposé ci-après : Pièce jointe 198647.

    J'ai fait un essai sur un fichier csv d'environ 70000 enregistrements

    Sur 5000 enregistrements, j'obtiens les résultats suivants :
    rawcount : 0.0015627145767211914
    CountLines : 0.010935616493225098
    simplecount : 0.007817888259887695
    opcount : 0.00937337875366211
    rawgencount : 0.003126716613769531
    rawincount : 0.0015618085861206054
    bufcount : 0.009373974800109864
    mapcount : 0.0015609979629516602

    Par avance merci

  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,

    Le fichier joint n'est pas accessible, et donc, je ne vois pas bien comment tu obtiens le nombre de lignes du fichier, ni s'il y a un traitement autre en même temps.

    Je donne juste une info: si on ne veut que compter le nombre de lignes d'un fichier texte, il y a une méthode beaucoup plus rapide que de lire les lignes de texte: il s'agit de faire une lecture binaire par bloc, et de compter les fins de ligne '\n'.

    J'avais fait un petit tuto sur le sujet ici: http://python.jpvweb.com/mesrecettes...lignes_fichier. C'est encore du Python 2, mais il est facile de le convertir en Python 3.

    Sur un fichier d'1 million de lignes, cette méthode est environ 10 fois plus rapide que de lire les lignes de texte.
    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
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    je pense que le code auquel le PO fait référence doit être celui-ci

  4. #4
    Membre régulier
    Profil pro
    manager
    Inscrit en
    Juin 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : manager

    Informations forums :
    Inscription : Juin 2007
    Messages : 44
    Points : 79
    Points
    79
    Par défaut Comptage de lignes et affichage des résultats
    Bonjour,

    C'est bien de ce code qu'il s'agit, que j'ai légèrement amendé des autres exemples proposés.

    Je réintègre le fichier, à la vérification, il était bien accessible

    Bien cordialement

    Citation Envoyé par BufferBob Voir le message
    salut,

    je pense que le code auquel le PO fait référence doit être celui-ci
    Fichiers attachés Fichiers attachés

  5. #5
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par TheGreyMustache Voir le message
    Bonjour,

    C'est bien de ce code qu'il s'agit, que j'ai légèrement amendé des autres exemples proposés.

    Je réintègre le fichier, à la vérification, il était bien accessible

    Bien cordialement
    Bonsoir,
    Non, il n'est toujours pas accessible dans le premier post.
    Dans le nouveau script, ce qui est intéressant, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i in range(9):
        for func in [mapcount, simplecount, bufcount, opcount, rawgencount, rawcount, rawincount, CountLines]:
            nbLi = 0
     
            start_time = time.time()
            nbLi = func("BIG_FILE.csv")
            counts[func].append(time.time() - start_time)
            counts[func].append(nbLi)
     
    for key, vals in counts.items():
        print (key.__name__, "\t : ", sum(vals) / float(len(vals)))
    qui permet ainsi de faire la moyenne du nombre de ligne et des durées (en une même opération).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for key, vals in counts.items():
        print (key.__name__, "\t : ", vals[1], sum(vals[::2])*500 / len(vals), "ms")
    permet d'avoir les trois valeurs (dont le nombre de lignes (une question du message de départ).

    Clodion

    PS tardif: je préférerais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    counts = defaultdict(list)
    rep = 9
     
    for func in [mapcount, simplecount, bufcount, opcount, rawgencount, rawcount, rawincount, CountLines]:
        nbLi = 0
     
        for i in range(rep):
            start_time = time.time()
            nbLi = func("medocs.csv")
            counts[func].append(time.time() - start_time)
        counts[func].append(nbLi)
     
    for key, vals in counts.items():
        print ("{} \t{}: \t{} ms".format(key.__name__, vals[-1], sum(vals[:-1])*1000 / (len(vals)-1)))

  6. #6
    Membre régulier
    Profil pro
    manager
    Inscrit en
    Juin 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : manager

    Informations forums :
    Inscription : Juin 2007
    Messages : 44
    Points : 79
    Points
    79
    Par défaut
    Merci Clodion. Il me reste à comprendre la chose

    J'avais une version un peu plus évoluée avec le passage en paramètres du fichier et du nombre d'itérations souhaitées, plus simple à utiliser. Le retraitement des paramètres se fait "à la main", je n'ai pas eu suffisamment de temps pour comprendre le fonctionnement de argparse qui est certainement bien plus élégant. Comme il me reste quelques erreurs (argument obligatoire vide eg. i- <filein> -o <fileout> attendu, mais lancé avec -i -o <fileout> par exemple) je ne l'ai pas mis ici.

    Si cela intéresse quelqu'un, je reposterai ultérieurement le code complet.

    merci

    TGM

    Citation Envoyé par Clodion Voir le message
    Bonsoir,
    Non, il n'est toujours pas accessible dans le premier post.
    Dans le nouveau script, ce qui est intéressant, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i in range(9):
        for func in [mapcount, simplecount, bufcount, opcount, rawgencount, rawcount, rawincount, CountLines]:
            nbLi = 0
     
            start_time = time.time()
            nbLi = func("BIG_FILE.csv")
            counts[func].append(time.time() - start_time)
            counts[func].append(nbLi)
     
    for key, vals in counts.items():
        print (key.__name__, "\t : ", sum(vals) / float(len(vals)))
    qui permet ainsi de faire la moyenne du nombre de ligne et des durées (en une même opération).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for key, vals in counts.items():
        print (key.__name__, "\t : ", vals[1], sum(vals[::2])*500 / len(vals), "ms")
    permet d'avoir les trois valeurs (dont le nombre de lignes (une question du message de départ).

    Clodion

    PS tardif: je préférerais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    counts = defaultdict(list)
    rep = 9
     
    for func in [mapcount, simplecount, bufcount, opcount, rawgencount, rawcount, rawincount, CountLines]:
        nbLi = 0
     
        for i in range(rep):
            start_time = time.time()
            nbLi = func("medocs.csv")
            counts[func].append(time.time() - start_time)
        counts[func].append(nbLi)
     
    for key, vals in counts.items():
        print ("{} \t{}: \t{} ms".format(key.__name__, vals[-1], sum(vals[:-1])*1000 / (len(vals)-1)))

Discussions similaires

  1. [MySQL] affichage des résultats d'une recherche dans la base
    Par dolf13 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 21/11/2006, 17h18
  2. [MySQL] Affichage des résultats d'une requête sur plusieurs pages
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2006, 13h24
  3. Aide pour affichage des résultats
    Par vanou dans le forum ASP
    Réponses: 7
    Dernier message: 08/06/2006, 20h53
  4. [MySQL] Affichage des résultats d'un requête
    Par wiwi dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/02/2006, 11h25
  5. Affichage des résultats d'un moteur de recherche
    Par poah dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2005, 14h31

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