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 :

diminuer le temp [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 112
    Points : 48
    Points
    48
    Par défaut diminuer le temp
    Bonjour
    j'ai un gros fichier Excel 80000 lignes et sur une colonne j'ai des condition à mettre
    le soucis est que le temps deviens exponentielle jusque 10000 pas de soucis, mais au delà il galère
    avais vous une idée du soucis que je rencontre et comment le résoudre
    Cordialement


    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
    61
    62
    63
    64
    65
    66
    import xlwings as xw
    import time
    import os
     
    def tempsReserv(res):
        print("res",res)
        arrTemps =  res.split(';')
    #    cumuldelta=
        for temps in arrTemps:
     
            if temps.startswith("02")==True: 
                delta = "OSR"
     
            elif  temps.startswith("20")==True:
                delta = "OSR"
            elif temps.startswith("RP")==True:
     
                delta ="RP"
            elif temps.startswith("ADF")==True:            
                delta ="ADF"
            elif temps.startswith("R")==True:            
                delta ="ING"
            elif temps.startswith("V")==True:            
                delta ="ING"
            elif temps.startswith("OSR")==True:            
                delta ="OSR"
            else:
                delta ="autre"
        return delta
     
     
     
    root = '/Users/II1154/Downloads/BT_2022-020522/'
    i=1
     
    wb_from = xw.Book(r"C:\Users\II1154\Desktop\bt_sortie_simplifie.xlsx")
    ws_from = wb_from.sheets['BT2']
     
    wb_from.sheets['BT2'].select
     
    nb_row = wb_from.sheets['BT2'].range('A1').end('down').row # dernière ligne
    datain = wb_from.sheets['BT2'].range('J2:J' + str(nb_row)).value
     
    list_N_aff = []
    tpslist = []
     
     
    h=1
    for x in datain:
        if x is None:
            x=""
        print("x",x)
        tps = tempsReserv(x)
        print("tps",tps)
     
        time.sleep(0)
        print("avant_tps_tps",tps)
        time.sleep(0)
        if h==10000:
            print("hhhhhhhhhhhhhhhhhhh",h) 
            time.sleep(10)
        h=h+1
        print(h)
        list_N_aff.append(tps)
        print(list_N_aff)
        time.sleep(0)

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

    Si le temps est exponentiel, découper le fichier et le traiter par parties (paralléliser) pourrait être une solution.

    Si le temps est une contrainte, travailler avec des fichiers CSV plutôt que des fichiers EXCEL (qui sont "lourds") pourrait être une piste à explorer... quitte a les transformer avant et après le traitement (et ce sera plus simple à paralléliser).

    - W

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut !

    Perso, je ne comprends pas bien ce que tu souhaites faire avec ton script.

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 206
    Points : 4 680
    Points
    4 680
    Par défaut
    Si j'ai bien compris, c'est le même script que l'autre
    Tu changes juste de colonne à traiter (et donc du traitement)

    Si le premier fonctionne, il n'y a pas de raison d'avoir maintenant un bloquage ! ici, le traitement est plus léger !

    fonction tempsReserv()

    Elle n'est pas logique:
    - test de toutes les colonnes pour retourner au final que la dernière ... pourquoi ne pas tester directement la dernière ??? ou débuter par la dernière et sortir si positif..
    - if if if if 36 fois, pourquoi ne pas faire un return au premier match ? (A noter, avec dernière version de python, nous avons maintenant "match ... case")
    - ps: les if condition == True ... c'est du niveau grand débutant python
    ( - écrire 2 "if" pour le même résultat ... pas trop python cela. if chaine[:2] in ["aa", "bb"]: return = "ok" )



    ps:
    les print() ... bof, cela multiplie le temps * 100 et peuvent générer ton tempo (à cause de ton terminal)
    print(list_N_aff) dans la boucle ! c'est une blaque ? normal qu'avec entre 10 000 et 80 000 items cette instruction est plus que lente

    Ici, tu n'as fait aucun calcul de temps donc ton affirmation d'une tempo à un moment (10 000) n'a aucun sens ! (utiliser time.perf_counter())
    Si tu désires faire des mesures de temps (pourquoi "désire", tu dois le faire) : ne pas les afficher mais les mettre dans un tableau que tu afficheras à la fin (enregistrer que les multiples de 400 suffit largement pour ton cas)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 112
    Points : 48
    Points
    48
    Par défaut
    Bonjour papajoker
    merci pour toute tes remarques très constructive.
    en effet tu avais raison sur toutes "les" lignes
    c'est en en effet la requete qui faisait planté ma requête en l'enlevant plus d'écart


    ensuite j'ai simplifié mes "if" est en effet j'avais pas pensé à prend les premiers caractères, je fais un parallèle avec powerbi, ce qui fut une erreur
    merci encore

  6. #6
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    420
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 420
    Points : 833
    Points
    833
    Par défaut
    Je ne connais pas xlwings alors ce que je dis là est peut-être faux.
    Avec win32com, en tout cas, les performances pour manipuler des fichiers excel (ou word) sont pour le moins moyennes.
    commencer par enregistrer le xls en csv et traiter le csv peut être une solution. C'est BEAUCOUP plus rapide.

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

Discussions similaires

  1. diminuer le temps de reponse de manipulation des fichiers
    Par fraisa1985 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 07/04/2008, 13h15
  2. diminuer le temps d'accées à une liste
    Par ouinih dans le forum C++
    Réponses: 4
    Dernier message: 16/06/2007, 13h47
  3. Réponses: 2
    Dernier message: 06/04/2007, 18h22
  4. Réponses: 2
    Dernier message: 13/02/2007, 14h59
  5. [Optimisation][Forum] Diminuer le temps de chargement (côté client) ?
    Par FremyCompany dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 8
    Dernier message: 31/08/2006, 20h16

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