Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1824 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  Par quel langage remplacer du python?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Par quel langage remplacer du python?

n°2302659
sliders_al​pha
Posté le 29-06-2017 à 10:38:42  profilanswer
 

Bonjour,

 

J'ai coder un programme python qui fais du travail sur des donnée, il faut quelque milliseconde pour faire une analyse, mais j'ai des milliard d'analyse a faire.

 

J'ai donc creer des thread, et j'ai vu mes resultats devenir plus lent a calculer :o
apres recherche il se trouve que python gere tres mal de multithreading, moi je voulais runner 1 thread par coeur, c'est impossible.

 

La partie analyse sont juste quelque calculs sur une longe liste de float, du coup je pourrais donner la liste de valeur et les parametre a esseyer calculé par le python pour les milliard d'analyse
a un programme dans un autre langage qui lui ferait ça bien en multi-thread.

 

Quel langage me conseillez vous? a part le python je connais le java et j'ai de veiuuuux souvenir de c++ (il y a 15 ans je ne codais que en ça mais je n'y ai pas touché depuis^^)

 

j'ai meme entendu dire qu'on peu avec certain langage lancer ses thread sur un GPU pour aller plus vite (j'ai une R9 290)

 

Merci.

 

ps : example de ce que je veux paralelliser avec le python

 

data = liste de millier de float
params = 4 valeurs, j'ai des milliard de groupe de 4 valeur a tester

 
Code :
  1. def analysis(params, data)
  2. p1, p2, p3, p4 = params
  3. stuff = 0
  4. for sample in data:
  5.  if sample < p1 and sample <p2:
  6.   stuff = xxxxxxxx
  7.  elif sample >p3 and sample>p4:
  8.   stuff = xxxxxxxx
  9.  else:
  10.   stuff = xxxxxx
  11. return stuff

Message cité 1 fois
Message édité par sliders_alpha le 29-06-2017 à 10:39:43
mood
Publicité
Posté le 29-06-2017 à 10:38:42  profilanswer
 

n°2302660
dede_sav
Posté le 29-06-2017 à 10:44:29  profilanswer
 

Salut,
 
Si tu veux garder le python tu peux regarder du coté des bibliothèques qui savent paralléliser (Tensorflow), reste à voir si tes analyses seront exploités ce type d'architecture. mal lu le problème :)
 
Sinon, la must en terme de perf reste le C++ correctement optimisé.
 
my2cent

Message cité 1 fois
Message édité par dede_sav le 29-06-2017 à 18:02:21
n°2302661
TotalRecal​l
Posté le 29-06-2017 à 10:52:41  profilanswer
 

L'algo a l'air méga simple, mais les données elles entrent et elles sortent sous quelle forme (genre Bdd, fichiers, etc) ?

 

Suggestion : pour ne pas réécrire tout ton programme tu peux peut-être juste déporter la partie critique (calcul) dans une bête DLL bien optimisée en C++ par exemple.
Evidemment il ne faut pas appeler une API à chaque calcul individuel sinbon ça va être monstrueusement lent, l'idée est de penser la préparation/restitution des données brutes pour n'avoir qu'un minimum d'appels à faire pour traiter un gros paquet d'infos d'un coup. Quitte à paralléliser ces appels.
Genre (par exemple)
- Tu prépares avec ton programme python un troupeau de fichiers avec x milliers de lignes de tes données d'entrée
- Tu appelles x fois en parallèle ta DLL en lui donnant à chaque appel l'un de ces fichiers et là où elle doit écrire les résultats
- Tu récupères les résultats dans ton programme python quand c'est fini


Message édité par TotalRecall le 29-06-2017 à 10:56:06

---------------
Topic .Net - C# @ Prog
n°2302665
rufo
Pas me confondre avec Lycos!
Posté le 29-06-2017 à 13:21:40  profilanswer
 

Tu peux peut-être tout faire faire dans une BD avec du SQL voire même une BD NoSQL ? Perso, j'avais un script PHP qui faisait de nombreux calculs et que je devais rendre plus rapide. Je suis passé par une BD Mysql et des requêtes SQL. Ca a ben boosté mon temps de traitement :)
 
D'une manière générale, regarde du côté du big data ;)
 
Edit : sinon, du C est une bonne option.


Message édité par rufo le 29-06-2017 à 13:22:04

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2302679
TotalRecal​l
Posté le 29-06-2017 à 14:26:05  profilanswer
 

Pas bête l'idée de tester ça en SQL vu que l'algo est ultra simple et les données se prêtent bien à un format BDD, y a pas besoin d'être un cador du PL SQL / T SQL pour ça !
 
Par contre comme je le demandais faut voir comment se présentent les données d'entrées et sortie : si il faut rajouter une bdd rien que pour le traitement ça ne vaudra pas trop le coup.


---------------
Topic .Net - C# @ Prog
n°2302690
sliders_al​pha
Posté le 29-06-2017 à 17:31:30  profilanswer
 

j'ai simplifier l'algo, en realité il est un peu plus compliqué^^
 
par exemple un condition ne peut pas etre redéclenché avant qu'une autre soit declenché.
Et quelque petite autre chose.
 
Alors a la base tout est dans une base sqlite.
Je me met un paquet en ram.
je precalcule les parametres.
et je fais tourner ma boucle.
 
il me faut 49 minutes pour faire passer 1 600 000 analyse.
j'ai aussi different type d'analyse, certaine bien plus compliquée.
 
mais oui, a la base je pensais a :
 
preparer des paquet de 100 000 parametres d'analyse
lancer 4 thread (1 par core) qui execute une analyse sur leur paquet de parametres.
recuperer les resultat quand un thread a finit.
Relancer le thread avec un nouveau paquet de paramètre.
traiter les resultat pendant ce moment.
 
Le c++ serait donc parfait, ça fait tellement longtemps que je n'y ai pas toucher, nostalgie.

n°2302691
masklinn
í dag viðrar vel til loftárása
Posté le 29-06-2017 à 17:41:23  profilanswer
 

sliders_alpha a écrit :

J'ai donc creer des thread, et j'ai vu mes resultats devenir plus lent a calculer :o
apres recherche il se trouve que python gere tres mal de multithreading, moi je voulais runner 1 thread par coeur, c'est impossible.

 

La partie analyse sont juste quelque calculs sur une longe liste de float, du coup je pourrais donner la liste de valeur et les parametre a esseyer calculé par le python pour les milliard d'analyse
a un programme dans un autre langage qui lui ferait ça bien en multi-thread.


Tu fais du multiprocess au lieu de faire du multithread [:spamafote]. Et multiprocessing a une API très très proche de threading avec des queues et tout (si les calculs individuels sont courts faut juste batcher un peu quand t'envoies le travail aux workers, vu que les communications coûtent un peu plus cher).

sliders_alpha a écrit :

Quel langage me conseillez vous? a part le python je connais le java et j'ai de veiuuuux souvenir de c++ (il y a 15 ans je ne codais que en ça mais je n'y ai pas touché depuis^^)


Avant de réimplémenter tout le bordel dans un autre language:

 
  • tu peux essayer de faire tourner ton machin sur pypy (il a aussi un GIL mais a un JIT, et les JIT marchent notablement super bien sur du numérique)
  • regarde si numpy/scipy ont pas des outils adéquats, ou bien regardes si numba ne donne pas de bons résultats sur ton bout de code (en bonus tu peux demander à numba de compiler ton kernel sans GIL)
  • l'option d'après c'est Cython, un dérivatif de Python qui compile en extensions natives, ça marche souvent bien pour avoir le "coeur" du programme en natif mais le reste en Python classique.
sliders_alpha a écrit :

j'ai meme entendu dire qu'on peu avec certain langage lancer ses thread sur un GPU pour aller plus vite (j'ai une R9 290)


Non tu peux pas. Tu peux spécifiquement écrire des programmes qui tournent sur le CPU (CUDA ou OpenCL), mais ça tu peux aussi le faire depuis Python (PyCUDA, PyOpenCL). Et idem pour les libs qui planquent la composition de kernel genre ArrayFire t'as généralement des bindings python dans la mesure où python est très très populaire dans les domaines scientifiques.


Message édité par masklinn le 29-06-2017 à 17:52:21

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2302693
Devil'sTig​er
Posté le 29-06-2017 à 17:43:56  profilanswer
 

On peut dire que tu as fait des choix plus que douteux si tu veux de la performance...
 
Du C++ avec MySQL/PostGres me parait un meilleur choix que ca (surtout C++).
Java si tu veux un compromis temps de dev/vitesse.

n°2302695
masklinn
í dag viðrar vel til loftárása
Posté le 29-06-2017 à 17:50:26  profilanswer
 

dede_sav a écrit :

Si tu veux garder le python tu peux regarder du coté des bibliothèques qui savent paralléliser (Tensorflow), reste à voir si tes analyses seront exploités ce type d'architecture.


Tensorflow c'est une lib de ML, ça a pas vraiment de rapport.


Message édité par masklinn le 29-06-2017 à 17:50:38

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°2302699
sliders_al​pha
Posté le 29-06-2017 à 18:15:07  profilanswer
 

Oui on viens de me parlet de multiprocessing, je ne connaissait pas.
 

Citation :

On peut dire que tu as fait des choix plus que douteux si tu veux de la performance...  
 


 
En fait je suis devellopeur java JEE de base, j'ai du apprendre le python a un moment pour generer des indicateur excels.
Et le python est devenu mon langage a tout faire (c'est un projet perso).
 
Jusqu'a aujourd'hui je n'avais jamais eu de probleme de perf.
 

mood
Publicité
Posté le 29-06-2017 à 18:15:07  profilanswer
 

n°2302704
rat de com​bat
attention rongeur méchant!
Posté le 29-06-2017 à 19:08:30  profilanswer
 

Si tu as fait du C++ go pour ce language, sinon le C. Ce dernier est plus compact que le C++ et donc plus facile à maîtriser (à mon avis) mais pour certains truc le C++ peut avoir des avantages (orienté objet et je ne sais quoi). Il existe un moyen d'intégrer du C/C++ en Python, je ne connais pas par contre. http://cython.org/

n°2302705
masklinn
í dag viðrar vel til loftárása
Posté le 29-06-2017 à 19:15:50  profilanswer
 

sliders_alpha a écrit :

Oui on viens de me parlet de multiprocessing, je ne connaissait pas.

 

Jusqu'a aujourd'hui je n'avais jamais eu de probleme de perf.


Bah non pas de raison, python s'très bien, c'est un language pratique et flexible. Et si c'est loin d'être le langage le plus rapide du monde, c'est un très bon langage "de glue" pour mixer des libs natives et explorer un domaine.

 

Regardes aussi les autres outils que j'ai listé, surtout si python est ton langage principal si tu fais régulièrement de l'analyse numérique les outils de la communauté scientifique sont utiles :D

rat de combat a écrit :

Si tu as fait du C++ go pour ce language, sinon le C. Ce dernier est plus compact que le C++ et donc plus facile à maîtriser (à mon avis) mais pour certains truc le C++ peut avoir des avantages (orienté objet et je ne sais quoi).


Oui puis s'plus facile de segfaulter en C et t'as pas de problèmes de messages d'erreur (vu que tu segfault)

rat de combat a écrit :

Il existe un moyen d'intégrer du C/C++ en Python, je ne connais pas par contre. http://cython.org/


Ya plein de moyens d'intégrer du C au Python (ctypes et cffi par exemple, ou des modules natifs). L'intérêt de cython c'est que c'est une partie de la sémantique C dans un langage très proche du Python (et qui crée des modules python natifs), donc tu fais du cython pour pas avoir à écrire du C.


Message édité par masklinn le 29-06-2017 à 19:17:47

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  Par quel langage remplacer du python?

 

Sujets relatifs
executer un script en python en variable?question de programmation python GPIO et raspbian
Quel langage pour tarificateur/comparateur ?résolution d'équation différentielle avec python
[Python] Questions pratiques installation et utilisation d'OpenCVExporter données Python vers Gnuplot
Aidez moi svp urgent isn Pythonpb avec python
Envoi d'informations en format kexadecimal en langage C 
Plus de sujets relatifs à : Par quel langage remplacer du python?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR