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 :

Lecture d'un fichier : appel / sans à un module


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Lecture d'un fichier : appel / sans à un module
    Bonjour

    Je tente d'effectuer la lecture d'un fichier binaire de 2 façons différentes. A première vue les 2 méthodes semblent identiques mais j'ai un rapport 3 en terme de délai de traitement. Je n'arrive vraiment pas à comprendre d'où vient le problème. C'est vrai aussi que je débute en Python.
    Je suis en version 3.7.3

    Voici le programme principal :

    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
    import time
    import binarystream
    import struct
     
    fn = "C:/toto.bin"
     
    # Ouverture du fichier
    with open(fn, "rb") as file_p:
     
        # Methode 1
        file_p.seek(0)
        tmStart = time.time()
     
        index = 0
        ar = file_p.read()
     
        while index < len (ar):
     
            value = ar[index:index + 4]
            index = index + 4
            val = int.from_bytes (value, byteorder='big', signed=True)
     
        deltat = time.time() - tmStart
        print("Methode 1 : {:f}".format(deltat))
        # Fin Methode 1
     
        # Methode 2
        file_p.seek(0) 
        tmStart = time.time()
     
        ar = binarystream.BinaryStream(file_p)
     
        while ar.index < len(ar.ar):
     
            value = ar.read_int32()
     
        deltat = time.time() - tmStart
        print("Methode 2 : {:f}".format(deltat))
        # Fin Methode 2
    le module binarystream

    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
    import struct
     
    class BinaryStream:
     
        def __init__(self, file):
            self.index = 0
            self.ar= file.read()
     
        def read_int32(self):
     
            value = self.ar[self.index:self.index + 4]
            self.index = self.index + 4
            val = int.from_bytes (value, byteorder='big', signed=True)
     
            return val

    J'ai l'impression que les 2 méthodes sont identiques mais pour un fichier de 25Mo :
    Méthode 1 : 7s
    Méthode 2 : 21s

    Mon erreur est certainement évidente mais rien à faire, je ne vois pas...

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Moi, sur un fichier de 87M:
    • Methode 1 : 24.814853
    • Methode 2 : 31.165576


    Maintenant, peut-être que pour faire un vrai test de benchmark il faudrait avoir deux programmes totalement indépendants. Parce que là, le fichier est d'abord lu (donc avec les méthodes de bufferisations il est alors chargé en mémoire) puis tu te replaces au début pour le relire => il y a fort à parier que l'OS va lire le buffer, pas le disque. Et en plus tu as un module "timeit" permettant de faire ce genre de tests (il te répère n fois la même fonction en la chronométrant puis te donne la moyenne des temps d'exécution => t'as même plus à t'embêter avec tes time).

    Sinon en effet tes deux codes sont équivalents (ils font les mêmes opérations).

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    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 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Salut,

    Citation Envoyé par bobby40600 Voir le message
    Mon erreur est certainement évidente mais rien à faire, je ne vois pas...
    Comparez le cœur du bousin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        while index < len (ar):
     
            value = ar[index:index + 4]
            index = index + 4
            val = int.from_bytes (value, byteorder='big', signed=True)
    avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        while ar.index < len(ar.ar):
     
            value = ar.read_int32()
    où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            value = self.ar[self.index:self.index + 4]
            self.index = self.index + 4
            val = int.from_bytes (value, byteorder='big', signed=True)
    Les appels de fonctions coûtent...
    Les indirections (ar.index, ar.ar, self.ar, self.index)... coûtent.

    Et quand je dis "coûtent", c'est qu'il faut exécuter plus d'instructions, et donc bouffer plus de CPU et attendre plus longtemps la sortie du résultat.

    - W

Discussions similaires

  1. lecture d'un fichier texte SANS l'ouvrir
    Par gratesnif dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/08/2007, 13h50
  2. [Excel] Lecture fichiers Excel sans Excel
    Par neometaller dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/04/2007, 09h32
  3. [C#] Lecture d'un fichier texte sans terminaison de ligne
    Par heavydrinker dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/10/2006, 10h03
  4. Lecture fichier wav sans librairie
    Par websurfeur dans le forum C
    Réponses: 3
    Dernier message: 12/09/2006, 10h51
  5. Lecture dans un fichier sans cat
    Par gandalfar dans le forum Linux
    Réponses: 5
    Dernier message: 27/12/2005, 11h35

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