Bonjour,
j'aurais besoin d'aide pour que le code ci-dessous aille beaucoup beaucoup plus vite, car j'ai plus de 4 millions de fichier à exécuter avec ce code et si je le laisse tel qu'il est j'en aurais pour au moins une à 2 semaines d'exécution. Alors que je dois l'utiliser toutes les semaines. Le code fais une recherchev par rapport à mon 1er tableau et met les valeurs dans mes fichiers, fais la somme de ma recherchev, supprime les valeurs de ma recherchev et place la ligne ou il y a la somme où il doit être placé.
Ensuite il fait la même chose pour un 2ème tableau et idem pour un 3ème tableau, et pour un 4ème tableau, ça va jusqu'à 10 tableau.
S'il vous plaît, c'est complexe pour moi donc si vous pouvez m'aider. Voici le code:
import os
|| || || |import pandas as pd| |from openpyxl import load_workbook| || |# ???? Définition des chemins| |dossier_source = "D:/PYTHON/VALEUR REMPLACER ZIP"| |fichier_rebase = "D:/PYTHON/REBASE.xlsx"| || |# ???? Chargement des valeurs de REBASE.xlsx| |wb_rebase = load_workbook(fichier_rebase, data_only=True)| |ws_rebase = wb_rebase.active| || |# ???? Extraction des valeurs des Tableaux 1 (A:B), 2 (D:E), 3 (G:H) et 4 (J:K)| |tableau_1 = pd.DataFrame(ws_rebase.iter_rows(min_row=1, max_row=273, min_col=1, max_col=2, values_only=True), columns=["Clé", "Valeur"])| |tableau_2 = pd.DataFrame(ws_rebase.iter_rows(min_row=1, max_row=273, min_col=4, max_col=5, values_only=True), columns=["Clé", "Valeur"])| |tableau_3 = pd.DataFrame(ws_rebase.iter_rows(min_row=1, max_row=273, min_col=7, max_col=8, values_only=True), columns=["Clé", "Valeur"])| |tableau_4 = pd.DataFrame(ws_rebase.iter_rows(min_row=1, max_row=273, min_col=10, max_col=11, values_only=True), columns=["Clé", "Valeur"])| || |# ???? Traitement des fichiers dans le dossier source| |for fichier in os.listdir(dossier_source):| |if fichier.endswith(".xlsx"):| |chemin_fichier = os.path.join(dossier_source, fichier)| || |# ???? Charger le fichier Excel| |wb = load_workbook(chemin_fichier)| |ws = wb.active| || |# ???? Identifier la dernière ligne contenant des données (entre 1 et 19)| |last_data_row = max([i for i in range(1, 20) if any(ws.cell(row=i, column=j).value for j in range(2, ws.max_column + 1))], default=1)| || |### ✅ Étape 1 : Remplacement avec le Tableau 1 (A:B)| |ligne_depart = 21| |if any(ws.cell(row=21, column=j).value for j in range(2, ws.max_column + 1)):| |ligne_depart = max([i for i in range(21, ws.max_row + 1) if any(ws.cell(row=i, column=j).value for j in range(2, ws.max_column + 1))], default=20) + 2 | || |ligne_debut_bloc_1 = ligne_depart| || |# ???? Ajout des valeurs du Tableau 1| |for col in range(2, ws.max_column + 1):| |for row in range(1, last_data_row + 1):| |valeur_originale = ws.cell(row=row, column=col).value| |if valeur_originale:| |valeur_remplacee = tableau_1.loc[tableau_1["Clé"] == valeur_originale, "Valeur"]| |if not valeur_remplacee.empty:| |ws.cell(row=ligne_depart + row - 1, column=col, value=valeur_remplacee.values[0])| || |# ???? Calcul de la somme du Tableau 1| |ligne_somme_1 = ligne_depart + last_data_row + 1| |somme_bloc_1 = [sum(ws.cell(row=row, column=col).value or 0 for row in range(ligne_debut_bloc_1, ligne_somme_1) if isinstance(ws.cell(row=row, column=col).value, (int, float))) for col in range(2, ws.max_column + 1)]| || |# ???? Suppression du bloc 1 et insertion des sommes à la ligne 21| |for row in range(ligne_debut_bloc_1, ligne_somme_1):| |for col in range(2, ws.max_column + 1):| |ws.cell(row=row, column=col, value=None)| |ws.delete_rows(ligne_debut_bloc_1, ligne_somme_1 - ligne_debut_bloc_1)| |ws.insert_rows(21)| |for col_idx, somme in enumerate(somme_bloc_1, start=2):| |ws.cell(row=21, column=col_idx, value=somme)| || |### ✅ Étape 4 : Remplacement avec le Tableau 4 (J:K)| |ligne_depart = max([i for i in range(21, ws.max_row + 1) if any(ws.cell(row=i, column=j).value for j in range(2, ws.max_column + 1))], default=20) + 2 | |ligne_debut_bloc_4 = ligne_depart| || |# ???? Ajout des valeurs du Tableau 4| |for col in range(2, ws.max_column + 1):| |for row in range(1, last_data_row + 1):| |valeur_originale = ws.cell(row=row, column=col).value| |if valeur_originale:| |valeur_remplacee = tableau_4.loc[tableau_4["Clé"] == valeur_originale, "Valeur"]| |if not valeur_remplacee.empty:| |ws.cell(row=ligne_depart + row - 1, column=col, value=valeur_remplacee.values[0])| || |# ???? Calcul de la somme du Tableau 4| |ligne_somme_4 = ligne_depart + last_data_row + 1| |somme_bloc_4 = [sum(ws.cell(row=row, column=col).value or 0 for row in range(ligne_debut_bloc_4, ligne_somme_4) if isinstance(ws.cell(row=row, column=col).value, (int, float))) for col in range(2, ws.max_column + 1)]| || |# ???? Suppression du bloc 4 et insertion des sommes à la ligne 24| |for row in range(ligne_debut_bloc_4, ligne_somme_4):| |for col in range(2, ws.max_column + 1):| |ws.cell(row=row, column=col, value=None)| |ws.delete_rows(ligne_debut_bloc_4, ligne_somme_4 - ligne_debut_bloc_4)| |ws.insert_rows(24)| |for col_idx, somme in enumerate(somme_bloc_4, start=2):| |ws.cell(row=24, column=col_idx, value=somme)| || |wb.save(chemin_fichier)| |print(f"✅ {fichier} mis à jour avec succès.")| || |print("✔ Tous les fichiers ont été traités correctement.")|
# code source python reformaté
Posté par Marc Quinton . Évalué à 3 (+2/-1). Dernière modification le 03 février 2025 à 07:52.
[^] # Re: code source python reformaté
Posté par Benoît Sibaud (site web personnel) . Évalué à 4 (+1/-0).
J'ai ajouté la coloration syntaxique.
[^] # Re: code source python reformaté
Posté par lolop (site web personnel) . Évalué à 6 (+4/-0).
Je ne sais pas ce qu'il a dans son tableau Excel, mais si c'est jouable, ça serait probablement plus rapide d'importer dans un tableau panda, faire toutes les manips dedans, puis exporter vers Excel. Et… s'il n'y a pas de formule dans le document, juste des valeurs, passer de Excel à CSV.
Parce que là je vois beaucoup de manips qui vont aller faire des allers/retours pour récupérer des valeurs dans le doc Excel, et je ne suis pas sûr que ça soit le plus optimal.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
# C'est à dire...
Posté par Graveen . Évalué à 9 (+7/-0). Dernière modification le 03 février 2025 à 09:58.
… tu veux un devis ? :D :D
[^] # Re: C'est à dire...
Posté par arnaudus . Évalué à 6 (+3/-0).
Tu te sens de faire un devis pour accélérer un algo par un facteur 106? :-)
[^] # Re: C'est à dire...
Posté par fearan . Évalué à 4 (+1/-0).
Vu que c'est du python traitant du excel, en single thread, y'a moyen de décompresser le excel, travailler en sax, et faire du multithread; je suppose qu'il y'a un chargement des fichiers complet en mémoire avant de travailler
ensuite une fois le fichier ouvert appliquer toutes les transformations, avant de l'écrire ; je pense qu'il est facile de gagner un facteur 10, ce qui est suffisant au niveau du besoin, lancer un traitement toutes les semaines, alors qu'il en prends 2, pour plus de sécurité, je répondrais par une amélioration d'un facteur 7.
ensuite ça risque d'être du c++ ou du java, ce sera plus cher en python car c'est un langage
de merdeque je n'apprécie pas.Et avoir une véritable expression du besoin plutôt que le résultat en python fera aussi partie de la question.
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: C'est à dire...
Posté par Sacha Trémoureux (site web personnel) . Évalué à 5 (+4/-0).
Merci pour ton expertise, j’envoie tout ça au client.
Rappelle moi ton TJM ? Ça te dérange qu’on envoie notre junior sorti d’école à la place ?
[^] # Re: C'est à dire...
Posté par Maclag . Évalué à 9 (+6/-0).
Amateur! Grâce à notre gestion optimale des coûts au bénéfice de nos clients, nos stagiaires abaissent le coût pour nos clients tout en nous permettant de dégager des marges suffisantes pour une relation pérenne entre nos 2 organisations.
Ah zut, j'ai écrit stagiaire? Je voulais bien entendu parler de nos collaborateurs!
# Moi je découperais le travail
Posté par gUI (Mastodon) . Évalué à 9 (+6/-0). Dernière modification le 03 février 2025 à 23:59.
Bon j'ai lu vite fait mais il me semble que je ferais 3 scripts python distincts :
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Moi je découperais le travail
Posté par Elfir3 . Évalué à 2 (+0/-0).
Un peu de respect svp, Guido Van Rossum purge déjà sa peine.
[^] # Re: Moi je découperais le travail
Posté par gUI (Mastodon) . Évalué à 4 (+1/-0). Dernière modification le 04 février 2025 à 18:16.
Pour moi le scandale ne réside pas spécialement dans l'utilisation de Python. Le scandale c'est déjà d'avoir imaginé un système qui génère 4 millions de fichiers (non mais pourquoi des fichiers ???), et au format Excel qui plus est (et pourquoi pas les imprimer, les faxer, et ensuite les faire passer par OCR pour les relire ?).
Vraiment, utiliser Python ou autre chose pour traiter ce gros tas d'immondice, c'est du détail.
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Moi je découperais le travail
Posté par Elfir3 . Évalué à 2 (+0/-0).
C'était bien entendu du second degré..
[^] # Re: Moi je découperais le travail
Posté par cg . Évalué à 4 (+2/-0).
S'il voulait 1 million de fois plus lent, l'idée se défend ;).
De mémoire, l'expérience faite pour le réseau par pigeon (RFC1149) permettait d'attendre ces sommets.
# C facile
Posté par harlock974 . Évalué à 0 (+1/-2).
Facile, réécrit le programme en C :
https://peter-jp-xie.medium.com/how-slow-is-python-compared-to-c-3795071ce82a
[^] # Re: C facile
Posté par Nicolas . Évalué à 3 (+2/-0).
L'exemple est claqué au sol. Je vérifierai chez moi ce soir mais à peu près certain que le compilo optimise en supprimant purement et simplement la boucle.
[^] # Re: C facile
Posté par Nicolas . Évalué à 2 (+1/-0). Dernière modification le 04 février 2025 à 21:08.
Voilà, flemme d’expliquer parce que je suis un peu rouillé :
gcc -masm=intel -O2 -S a.c
Un code sans boucle :
VERSUS
gcc -masm=intel -S a.c
Un code avec boucle (
jmp
est l’instruction de saut pour initier la boucle etjl
est l’instruction de saut tant que la boucle continue)En Python, tu ne vas pas écrire ton code comme tu l’écris en C. Tu va faire plutôt un truc du genre (pas testé, j’ai la flemme) :
T’auras à peu de chose prêt les perf. du C. À fortiori.
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.