MakeMake The Dwarf Planet is a feed agregator.

Demande pour que mon code python aille 1 million de fois plus vite car j'ai au moins 4 millions de f

by Lilie3887 from Linuxfr.org

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.")|

Télécharger ce contenu au format EPUB

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lire la suite…

Inline C dans une fonction Python

by mdk from AFPy discuss

Parce que, je voulais voir où ça mènerai, bah ça mène là (pour Linux uniquement) :

import shlex
import tempfile
from ctypes import CDLL, py_object
from functools import wraps
from inspect import signature
from subprocess import PIPE, run


def compile(c_str) -> CDLL:
    with tempfile.TemporaryDirectory() as tmpdir:
        with open(f"{tmpdir}/tmp.c", "w", encoding="UTF-8") as f:
            f.write(c_str)
        flags = shlex.split(run(["python3-config", "--cflags", "--ldflags"], encoding="UTF-8", stdout=PIPE).stdout)
        run(["cc", "-shared", "-fPIC", "-xc"] + flags + [f"-o{tmpdir}/tmp.so", f"{tmpdir}/tmp.c"], check=True)
        return CDLL(f"{tmpdir}/tmp.so")


def c(fct):
    parameters = signature(fct).parameters
    c_args = ", ".join([f"PyObject *{name}" for name in parameters.keys()])
    lib = compile(FR"""
#include <stdio.h>
#include <Python.h>

PyObject *the_function({c_args}) {{
    {fct.__doc__}
}}
""")
    lib.the_function.argtypes = [py_object] * len(parameters)
    lib.the_function.restype = py_object
    @wraps(fct)
    def call_c(*args):
        return lib.the_function(*args)
    return call_c


@c
def cprint(pyobject):
    r"""
    Py_ssize_t size;
    const char *str;

    PyGILState_STATE state = PyGILState_Ensure();
    if (PyUnicode_CheckExact(pyobject)) {
        str = PyUnicode_AsUTF8AndSize(pyobject, &size);
        write(1, str, size);
        write(1, "\n", 1);
    }
    else {
        PyObject *repr = PyObject_Repr(pyobject);
        printf("%s\n", PyUnicode_AsUTF8(repr));
    }
    PyGILState_Release(state);
    return Py_None;
    """


@c
def fib(n):
    """
    long m = PyLong_AsLong(n);
    long a = 1;
    long b = 1;

    PyGILState_STATE state = PyGILState_Ensure();
    for (int i = 0; i < m; i++) {
        b = a + b;
        a = b - a;
    }
    n = PyLong_FromLong(a);
    PyGILState_Release(state);
    return n;
    """


def main():
    cprint([fib(i) for i in range(40)])


if __name__ == "__main__":
    main()

Bon ça marche, ça m’amuse, c’est tout.

OK pour ceux qui veulent vraiment parler perfs, même si c’était pas mon but (promis) :

$ pyperf timeit -s 'import inline_c' 'inline_c.py_fib(40)'
.....................
Mean +- std dev: 993 ns +- 70 ns

$ pyperf timeit -s 'import inline_c' 'inline_c.c_fib(40)'
.....................
Mean +- std dev: 257 ns +- 6 ns

mais on perd la magie des int de Python, très vite le long ne suffira pas a contenir le résultat de fib, les deux implèms ne sont donc pas comparables, l’une est rapide, l’autre est juste, meh, arrêtons de parler perfs.

Qui pour implémenter @asm ?

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

wrapper python pour une lib en C

by Mindiell from AFPy discuss

Bonjour ici,

j’ai un petit souci avec une lib en C que j’ai produite avec une seule fonction.

Le code C de toto.c :

#include <stdio.h>

char * titi(void) {
	return "Hello world!";
}

qui donne toto.so.

Le wrapper python toto.py :

from ctypes import CDLL, c_char_p

# Load the shared library
toto = CDLL("./toto.so")
toto.titi.restype = c_char_p

Et le code de test test_toto.py :

import toto

print(toto.titi())

Voilà, un truc assez basique, j’ai jeté un oeil à pas mal de tutos, et j’obtiens toujours la même erreur quand j’utilise le dernier script :

Traceback (most recent call last):
  File "test_toto.py", line 1, in <module>
    import toto
ImportError: dynamic module does not define module export function (PyInit_toto)

Si j’exécute la fonction titi depuis le fichier toto.py, elle est bien appelée sans souci. Mais il semble que je ne puisse pas l’appeler depuis un import.

Sur les internets ça parle de version de compilateur,… Si vous avez une idée, je suis preneur !

4 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

Bonne année 2025 !

by grewn0uille from AFPy discuss

Bonjour tout le monde,

L’AFPy vous souhaite une bonne année 2025 et vous présente ses meilleurs vœux pour cette nouvelle année !

En ce début d’année, nous avons lancé notre campagne d’adhésions 2025 sur HelloAsso : https://www.helloasso.com/associations/afpy/adhesions/adhesion-2025-a-l-afpy :sparkles:

Être membre de l’AFPy vous permet de prendre part à la vie de l’association en votant lors de l’Assemblée Générale et vous permettez à l’APFy de financer ses frais de fonctionnement, d’engager les dépenses pour l’organisation de la PyConFR et d’assurer la promotion du langage Python en francophonie :snake:

Concernant les vidéos de la PyConFR 2024, une bonne partie est disponible sur IndyMotion : PyConFR2024 - IndyMotion
D’autres nécessitent plus de travail et sont encore en cours de traitement. Elles arriveront au fur et à mesure !

Pour ne manquer aucune nouvelle sur l’AFPy, les meetups locaux et la PyConFR, vous pouvez nous suivre sur nos différents réseaux (AFPy (@AFPy@mamot.fr) - Mamot - Le Mastodon de La Quadrature du Net et Association Francophone Python (AFPy) | LinkedIn), participer sur le forum (https://discuss.afpy.org/) ou le salon Discord (AFPy) :blush:

Merci pour votre soutien :sparkling_heart:


L’équipe de l’AFPy (Association Francophone Python)

3 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…

Bras robotisé MKX3D

by phroy from AFPy discuss

Bonjour à tous, je vous présente le bras robotisé MKX3D open source.

  • Il est réellement open source en effet les fichiers CAO (SolidWorks) sont sous CC BY-NC-SA et l’interface de prog en GNU GPL.
  • Il est programmable en Python.
  • Le bras est complétement imprimable son coût est autour des 400 € (l’équivalent dans le commerce est à 4000 € et bien évidement en closed)
  • La plateforme de dev est Blender/UPBGE + Python + Arduino

Le dépôt est sur la Forge (gitlab de l’Education Nationale) : Bras MKX3D / Jumeau numérique · GitLab

Une présentation plus longue (20 min) est ici : Bras MKX3D : Présentation longue - Sciences & Technologies

1 message - 1 participant(e)

Lire le sujet en entier

Lire la suite…

Sur Aix-en-Provence − Meetup le 6 février

by grewn0uille from AFPy discuss

Hello tout le monde,

Il y a un meetup Python sur Aix-en-Provence le jeudi 6 février.
Rendez-vous à partir de 18h à « Chez les Copains ».

Organisé par Karine (Karine sur Discord :)).

N’hésitez pas à signaler votre présence sur le thread “Meetup à Aix-en-Provence” sur Discord afin de faciliter la réservation !

Meetup Aix-en-Provence

2025-02-06 18:00 (Europe/Paris) → 2025-02-06 22:00 (Europe/Paris)

5 messages - 3 participant(e)s

Lire le sujet en entier

Lire la suite…

activation (rond noirci) d'un radiobouton + thread ?

by mapommfj from AFPy discuss

Bonjour,
je veux lancer des programmes à l’aide de radiobouton. Dans le cas d’un flatpak, il faut un certain temps pour l’ouvrir. Dans ce cas le radiobouton ne s’active qu’après la fermeture du flatpak correctement lancé. J’ai pensé que c’était une histoire de thread mais je n’y arrive visiblement pas. Un petit coup de main serait le bienvenu.

def task():
	if var.get() == 1:
		var.set(1)
	elif var.get() == 2:
		var.set(2)

def run_app():
	if var.get() == 1:
		wr_ge='flatpak run org.gimp.GIMP'
		subprocess.run(wr_ge, shell=True)
	elif var.get() == 2:
		subprocess.Popen('/usr/bin/pdfarranger')

fen = Tk()
fen.geometry('350x100+1200+300')
var = IntVar()
c1 = Radiobutton(fen, text='GIMP : éditeur graphique',variable=var, bg="bisque", command=run_app, value = 1)
c1.place(x=10,y=10)
c2 = Radiobutton(fen, text='PDFarranger : gestionnaire PDF',variable=var, bg="bisque", command=run_app, value = 2)
c2.place(x=10,y=40)
t1 = Thread(target=task)
t1.start()
fen.mainloop()
t1.join()

6 messages - 2 participant(e)s

Lire le sujet en entier

Lire la suite…