Par quel langage remplacer du python?

Par quel langage remplacer du python? - Divers - Programmation

Marsh Posté le 29-06-2017 à 10:38:42    

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
Reply

Marsh Posté le 29-06-2017 à 10:38:42   

Reply

Marsh Posté le 29-06-2017 à 10:44:29    

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
Reply

Marsh Posté le 29-06-2017 à 10:52:41    

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

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 29-06-2017 à 13:21:40    

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
Reply

Marsh Posté le 29-06-2017 à 14:26:05    

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.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 29-06-2017 à 17:31:30    

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.

Reply

Marsh Posté le 29-06-2017 à 17:41:23    

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
Reply

Marsh Posté le 29-06-2017 à 17:43:56    

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.

Reply

Marsh Posté le 29-06-2017 à 17:50:26    

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
Reply

Marsh Posté le 29-06-2017 à 18:15:07    

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.
 

Reply

Marsh Posté le 29-06-2017 à 18:15:07   

Reply

Marsh Posté le 29-06-2017 à 19:08:30    

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/

Reply

Marsh Posté le 29-06-2017 à 19:15:50    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed