Informatique quantique (ou pas)
-
Ravortel
- Dieu d'après le panthéon
- Messages : 6489
- Inscription : lun. juin 02, 2014 5:52 pm
- Localisation : Pas là.
Re: Informatique quantique (ou pas)
L'argumentaire pour le RAZ n'est pas ultra-convainquant 
Dieu du Vrai, Ultime et Tant Envié Foie Gras Véritable
- OSR
- Dieu d'après le panthéon
- Messages : 3244
- Inscription : mar. nov. 21, 2017 10:32 am
Re: Informatique quantique (ou pas)
D'expérience il faut vider régulièrement ses SMS et ses listes d'appels pour que le téléphone ne soit pas trop ralenti.
Et je ne suis pas le seul à le constater, j'avais suivi le conseil donné par pas mal d'utilisateurs de dumbphones de la marque, ça m'avait bien servi à une époque où plusieurs fonctions (annuaire, composition de SMS...) étaient devenues inutilisables à cause de journaux SMS/appels trop lourds.
Là le RAZ a sans doute vidé pas mal d'applis inutiles et purgé des caches divers (dont sans doute quelques détritus d'applis désintallées), mon téléphone semble re-ressuscité (la composition de SMS et l'usage de la radio FM étaient devenus aléatoires ces derniers jours).
OSR = hommage à la défunte compagnie ferroviaire
Du rétrovieux et du complotisme narrativoïde sur Lulu / DriveThruRPG / Itch.io, et une page web pour tout rassembler : https://sites.google.com/view/retrovieux
Je ne crois pas à la théorie rôliste.
Du rétrovieux et du complotisme narrativoïde sur Lulu / DriveThruRPG / Itch.io, et une page web pour tout rassembler : https://sites.google.com/view/retrovieux
Je ne crois pas à la théorie rôliste.
- cdang
- Dieu d'après le panthéon
- Messages : 7886
- Inscription : jeu. avr. 30, 2015 10:23 am
- Localisation : Le Havre (Choisy-le-Roi, Saint-Étienne, La Rochelle)
Re: Informatique quantique (ou pas)
Je suis sorti de ma limérence, je vais pouvoir purger mes SMS...
--
Vous êtes mort
[2 points CLETCSOOEF]
Vous êtes mort
[2 points CLETCSOOEF]
- cdang
- Dieu d'après le panthéon
- Messages : 7886
- Inscription : jeu. avr. 30, 2015 10:23 am
- Localisation : Le Havre (Choisy-le-Roi, Saint-Étienne, La Rochelle)
Re: Informatique quantique (ou pas)
Coucou les gens,
Quelqu'un pourrait m'aider à optimiser du code Python 3 avec NumPy ?
Le contexte : j'ai un fichier qui décrit une géométrie, sous la forme d'une liste d'un million (1e6) de points ; un point, c'est un entier, l'identifiant id, et trois réels, les coordonnées x, y et z. J'ai donc un fichier CSV maillage qui a la forme
Et j'ai un fichier de valeurs pour 100 000 (1e5) de ces points, donc un entier id, l'identifiant du point, et un réel v, la valeur. J'ai donc un second fichier CSV valeurs qui a la forme
Il faut que je regroupe les coordonnées avec les valeurs, donc avoir au final un CSV resultat de la forme
Et pour cela que j'élimine, d'une manière ou d'une autre, les points qui n'ont pas de valeur associée.
Les deux fichiers sont classés par valeurs d'identifiants croissantes.
Bon, actuellement, ça me prend un peu moins de 3 minutes, c'est acceptable ; mais je fais une boucle sur la liste des 1e6 points (et à chaque boucle je compare aux 1e5 points ayant une valeur) et je trouve ça inélégant, et inefficace, au possible. En gros, j'ai fait un truc du genre (reproduit de mémoire, je n'ai pas le code exact sous les yeux) :
Pour la fonction np.where() : https://numpy.org/doc/stable/reference/ ... umpy.where
Bref, quelqu'un aurait une solution élégante et parallèle pour remplacer cette boucle ?
(Tiens, je pourrai peut-être commencer par extraire le vecteur valeurs[:, 1] une fois pour toute au lieu de le faire à chaque itération... J'essaie demain voir ce que je gagne.)
Quelqu'un pourrait m'aider à optimiser du code Python 3 avec NumPy ?
Le contexte : j'ai un fichier qui décrit une géométrie, sous la forme d'une liste d'un million (1e6) de points ; un point, c'est un entier, l'identifiant id, et trois réels, les coordonnées x, y et z. J'ai donc un fichier CSV maillage qui a la forme
Code : Tout sélectionner
id1, x1, y1, z3
id2, x2, y2, z2
id3, x3, y3, z3
...Code : Tout sélectionner
id1, v1
id2, v2
id3, v3
...Code : Tout sélectionner
id1, x1, y1, z3, v1
id2, x2, y2, z2, v2
id3, x3, y3, z3, v3
...Les deux fichiers sont classés par valeurs d'identifiants croissantes.
Bon, actuellement, ça me prend un peu moins de 3 minutes, c'est acceptable ; mais je fais une boucle sur la liste des 1e6 points (et à chaque boucle je compare aux 1e5 points ayant une valeur) et je trouve ça inélégant, et inefficace, au possible. En gros, j'ai fait un truc du genre (reproduit de mémoire, je n'ai pas le code exact sous les yeux) :
Code : Tout sélectionner
longueur = len(maillage) # nombre de points, env. 1e6
booleen = (np.ones(longueur) == 1) # initialisation d'un vecteur de booléens
for i in range(longueur):
booleen[i] = len(np.where(maillage[i, 0] == valeurs[:, 0])[0]) > 0
# si la valeur maillage[i, 0] se trouve quelque part dans le vecteur valeurs[:, 0], np.where() n'est pas vide
# donc booleen[i] est vrai si le point a une valeur, faux s'il n'en a pas
resultat = np.concatenate(maillage[booleen, :], valeurs[:, 1], axis=1)Bref, quelqu'un aurait une solution élégante et parallèle pour remplacer cette boucle ?
(Tiens, je pourrai peut-être commencer par extraire le vecteur valeurs[:, 1] une fois pour toute au lieu de le faire à chaque itération... J'essaie demain voir ce que je gagne.)
--
Vous êtes mort
[2 points CLETCSOOEF]
Vous êtes mort
[2 points CLETCSOOEF]
- Tgx
- Messie
- Messages : 1098
- Inscription : mer. janv. 02, 2013 1:40 pm
- Localisation : Badlands (Ivry sur Seine)
Re: Informatique quantique (ou pas)
je code plus depuis un moment mais de mémoire, avec les algo de tri, on peut passer de n² à n log n. Quicksort, peut-être ?
Tu dois pouvoir appliquer le même genre de logique ?
Tu dois pouvoir appliquer le même genre de logique ?
« il se rencontre aussi dans le cœur humain un goût dépravé pour l'égalité, qui porte les faibles à vouloir attirer les forts à leur niveau, et qui réduit les hommes à préférer l'égalité dans la servitude à l'inégalité dans la liberté »
(Alexis de Tocqueville, de la démocratie en Amérique)
(Alexis de Tocqueville, de la démocratie en Amérique)
- Mugen
- Dieu des bottes de cuir
- Messages : 15678
- Inscription : mer. mai 17, 2006 11:34 am
Re: Informatique quantique (ou pas)
@cdang je ne comprends pas comment se fait le lien entre les points de ton premier fichier et les valeurs du second. Tel qu'énoncé, j'ai immédiatement pensé à des températures, mais j'imagine que ce n'est pas ça, car sinon il n'y aurait pas moyen de faire de lien...
Bon, je suis allergique au Python, donc je n'aurai sans doute pas la solution adaptée à ton problème... Mais il doit y avoir des fonctions de tri sur les données, non ?
Bon, je suis allergique au Python, donc je n'aurai sans doute pas la solution adaptée à ton problème... Mais il doit y avoir des fonctions de tri sur les données, non ?
Sois satisfait des fruit, des fleurs et même des feuilles,
Si c'est dans ton jardin à toi que tu les cueilles.
Ne pas monter bien haut peut-être, mais tout seul.
Si c'est dans ton jardin à toi que tu les cueilles.
Ne pas monter bien haut peut-être, mais tout seul.
- Inigin
- Dieu des hakamas perdus
- Messages : 14051
- Inscription : dim. août 02, 2009 7:27 am
- Localisation : à droite de Saint-Ex
Re: Informatique quantique (ou pas)
Si je traduis en termes non-Python, tu cherches à faire une recherche verticale pour rendre les valeurs du deuxième fichier dans le premier, et ensuite une purge.
- cdang
- Dieu d'après le panthéon
- Messages : 7886
- Inscription : jeu. avr. 30, 2015 10:23 am
- Localisation : Le Havre (Choisy-le-Roi, Saint-Étienne, La Rochelle)
Re: Informatique quantique (ou pas)
Le lien, c'est l'identifiant du point. Chaque point a un numéro N, la première colonne. Le premier fichier donne les coordonnées (X, Y, Z) du point N, le second fichier donne la valeur V associée au point N (ça peut être une température si tu veux, ça n'a pas d'importance, ici c'est une contrainte au sens de la mécanique des milieux continus).Mugen a écrit : ↑mar. juin 30, 2026 8:29 am @cdang je ne comprends pas comment se fait le lien entre les points de ton premier fichier et les valeurs du second. Tel qu'énoncé, j'ai immédiatement pensé à des températures, mais j'imagine que ce n'est pas ça, car sinon il n'y aurait pas moyen de faire de lien...
Sauf que tous les points N n'ont pas de valeur.
@Inigin : oui, on peut voir ça comme ça.
--
Vous êtes mort
[2 points CLETCSOOEF]
Vous êtes mort
[2 points CLETCSOOEF]
- Nolendur
- Dieu matters
- Messages : 5165
- Inscription : mar. mai 20, 2008 3:51 pm
- Localisation : Bordeaux
- Contact :
Re: Informatique quantique (ou pas)
Alors, il m'a fallu un peu de temps pour comprendre la logique du truc (elle est un peu emberlificotée
Code : Tout sélectionner
id_maillage = maillage[:, 0]
id_valeurs = valeurs[:, 0]
_, commun_maillage, commun_valeurs = np.intersect1d(
id_maillage,
id_valeurs,
assume_unique=True,
return_indices=True
)
resultat = np.concatenate(
(
maillage[commun_maillage],
valeurs[commun_valeurs, 1:2]
),
axis=1
)Explication : intersect1d fait tout le boulot de sélectionner les lignes en commun, et concatenate assemble les lignes communes.
Attention : cette solution ne marche que si les deux matrices sont déjà pré-triées sur la colonne "id".
Il a fallu que je me replonge dans la documentation de numpy, c'est pas quelque chose que j'utilise souvent, donc vérifie et teste le code avant de crier victoire.
-
Ramentu
- Dieu d'après le panthéon
- Messages : 2097
- Inscription : jeu. août 15, 2019 10:07 am
- Localisation : Luxembourg
Re: Informatique quantique (ou pas)
Tu veux définitivement utiliser une fonction de tri.
2 fichier csv d'un million de lignes (id aléatoires entre 0 et 2 million)
listes triées par id, sans doublon d'id
Temps d'exécution : 0.033 secondes (sur pc de gaming, soit
)
Tu utilises numpy.searchsorted pour bâtir un index des points ou tu devrais insérer chaque ligne de la liste 2 dans la liste 1 pour obtenir un array trié,
pour chaque ligne dans el tableau 2, tu regardes si l'id1 au point d'insertion est égale à l'id2 ( tu insèrerais id2 juste avant l'id1 identique ou plus grande pour avoir la liste triée)
tu crée un masque, et tu extraits les lignes correspondantes dans les 2 listes, puis tu crées ton tableau résultat
(avec l'aide de Claude pour la gestion des fichiers et le masque, bien plus élégant que la boucle que j'avais envisagée au début
)
import numpy as np
import time
list1 = np.genfromtxt("list1.csv", delimiter=",", names=["id","x","y","z"], dtype=None, skip_header=1)
list2 = np.genfromtxt("list2.csv", delimiter=",", names=["id","v"], dtype=None, skip_header=1)
start = time.perf_counter()
index = np.searchsorted(list1["id"], list2["id"])
masque = list1["id"][index] == list2["id"]
ok1 = list1[index[masque]]
ok2 = list2[masque]
result = np.empty(masque.sum(), dtype=[("id","i8"),("x","f8"),("y","f8"),("z","f8"),("v","f8")])
result["id"] = ok1["id"]
result["x"] = ok1["x"]
result["y"] = ok1["y"]
result["z"] = ok1["z"]
result["v"] = ok2["v"]
elapsed = time.perf_counter() - start
print(f"Temps d'exécution : {elapsed:.3f} secondes")
np.savetxt("result.csv", result, delimiter=",", header="id,x,y,z,v", comments="", fmt=["%d","%.6f","%.6f","%.6f","%.6f"])
2 fichier csv d'un million de lignes (id aléatoires entre 0 et 2 million)
listes triées par id, sans doublon d'id
Temps d'exécution : 0.033 secondes (sur pc de gaming, soit
Tu utilises numpy.searchsorted pour bâtir un index des points ou tu devrais insérer chaque ligne de la liste 2 dans la liste 1 pour obtenir un array trié,
pour chaque ligne dans el tableau 2, tu regardes si l'id1 au point d'insertion est égale à l'id2 ( tu insèrerais id2 juste avant l'id1 identique ou plus grande pour avoir la liste triée)
tu crée un masque, et tu extraits les lignes correspondantes dans les 2 listes, puis tu crées ton tableau résultat
(avec l'aide de Claude pour la gestion des fichiers et le masque, bien plus élégant que la boucle que j'avais envisagée au début
import numpy as np
import time
list1 = np.genfromtxt("list1.csv", delimiter=",", names=["id","x","y","z"], dtype=None, skip_header=1)
list2 = np.genfromtxt("list2.csv", delimiter=",", names=["id","v"], dtype=None, skip_header=1)
start = time.perf_counter()
index = np.searchsorted(list1["id"], list2["id"])
masque = list1["id"][index] == list2["id"]
ok1 = list1[index[masque]]
ok2 = list2[masque]
result = np.empty(masque.sum(), dtype=[("id","i8"),("x","f8"),("y","f8"),("z","f8"),("v","f8")])
result["id"] = ok1["id"]
result["x"] = ok1["x"]
result["y"] = ok1["y"]
result["z"] = ok1["z"]
result["v"] = ok2["v"]
elapsed = time.perf_counter() - start
print(f"Temps d'exécution : {elapsed:.3f} secondes")
np.savetxt("result.csv", result, delimiter=",", header="id,x,y,z,v", comments="", fmt=["%d","%.6f","%.6f","%.6f","%.6f"])
Dernière modification par Ramentu le mar. juin 30, 2026 6:16 pm, modifié 5 fois.
- cdang
- Dieu d'après le panthéon
- Messages : 7886
- Inscription : jeu. avr. 30, 2015 10:23 am
- Localisation : Le Havre (Choisy-le-Roi, Saint-Étienne, La Rochelle)
Re: Informatique quantique (ou pas)
Merci @Nolendur et @Ramentu, je regarde ça demain (ce soir j'ai ciné ^^).
C'est quoi le _, ?
[Ajout] Ah, c'est bon, j'ai trouvé la réponse, c'est pour ignorer le premier élément renvoyé
https://www.iditect.com/faq/python/mean ... rator.html
C'est quoi le _, ?
[Ajout] Ah, c'est bon, j'ai trouvé la réponse, c'est pour ignorer le premier élément renvoyé
https://www.iditect.com/faq/python/mean ... rator.html
--
Vous êtes mort
[2 points CLETCSOOEF]
Vous êtes mort
[2 points CLETCSOOEF]
- Nolendur
- Dieu matters
- Messages : 5165
- Inscription : mar. mai 20, 2008 3:51 pm
- Localisation : Bordeaux
- Contact :
Re: Informatique quantique (ou pas)
C'est pour ne pas récupérer un paramètre renvoyé par la fonction et dont tu n'as pas besoin. On pourrait mettre à la place une variable bidon, mais ça pourrait engendrer de la confusion, donc on met ça à la place.
EDIT: désolé, ma réponse a croisé ton auto-réponse
-
Ramentu
- Dieu d'après le panthéon
- Messages : 2097
- Inscription : jeu. août 15, 2019 10:07 am
- Localisation : Luxembourg
Re: Informatique quantique (ou pas)
pris de vitesse par @Nolendur
j'étais parti sur searchsorted puis une boucle, puis sur searchsorted et un masque d'extraction (mieux), mais intersect1d fait tout le boulot en une commande
(pas familier non plus avec numpy ...)
j'étais parti sur searchsorted puis une boucle, puis sur searchsorted et un masque d'extraction (mieux), mais intersect1d fait tout le boulot en une commande
(pas familier non plus avec numpy ...)
- Mugen
- Dieu des bottes de cuir
- Messages : 15678
- Inscription : mer. mai 17, 2006 11:34 am
Re: Informatique quantique (ou pas)
Après, pour vraiment aller vite, il faudra un autre langage que le python. 
Sois satisfait des fruit, des fleurs et même des feuilles,
Si c'est dans ton jardin à toi que tu les cueilles.
Ne pas monter bien haut peut-être, mais tout seul.
Si c'est dans ton jardin à toi que tu les cueilles.
Ne pas monter bien haut peut-être, mais tout seul.
-
Ramentu
- Dieu d'après le panthéon
- Messages : 2097
- Inscription : jeu. août 15, 2019 10:07 am
- Localisation : Luxembourg
Re: Informatique quantique (ou pas)
Au passage, si tu n'as jamais plus d'1 million de lignes, Excel fait le boulot en - de 30 secondes (je n'ai pas chronométré précisément, test sur les mêmes tables que celles utilisées pour tester le script))
Un simple xlookup de la table 1 sur la table 2, tu dois pouvoir faire mieux avec une powerquery et un merge, mais pour le résultat attendu, a quoi bon
Ne pas essayer sur un laptop poussif avec peu de ram
- et ne pas oublier de "copy/paste as value" la colonne xlookup avant de faire quoi que ce soit d'autre 
Bien sur, ça ne vaut pas les quelques centièmes de secondes d'un script python*, mais c'est plus rapide que 2 boucles imbriquées, et si tu ne dois le faire que de temps à autre ...
(*:Il ne faut que 4 centièmes de seconde à Python pour fusionner les 2 listes. Mais revoyons le tri au ralenti ...
)
Un simple xlookup de la table 1 sur la table 2, tu dois pouvoir faire mieux avec une powerquery et un merge, mais pour le résultat attendu, a quoi bon
Ne pas essayer sur un laptop poussif avec peu de ram
Bien sur, ça ne vaut pas les quelques centièmes de secondes d'un script python*, mais c'est plus rapide que 2 boucles imbriquées, et si tu ne dois le faire que de temps à autre ...
(*:Il ne faut que 4 centièmes de seconde à Python pour fusionner les 2 listes. Mais revoyons le tri au ralenti ...






