Multithreading python
Bonjour
,
Je veux écrire un programme python qui me permet de calculer Pi mais lors de l'exécution du programme je m'aperçois que seulement 10% du processeur et utiliser.
En me renseignant sur différents forums, j'ai vu que python n'exécutait pas les programmes sur plusieurs cœurs.
Je voulais donc savoir comment faire pour utiliser les 12 cœurs du processeur afin de gagner du temps lors de l'exécution du programme.
J'ai déjà essayé de regarder sur des forums, mais je ne suis pas parvenu à résoudre le problème. Je voulais que par exemple le 1er cœur face les 10 millions de 1ère boucles et qu'en même temps le 2ème cœur face les 10 millions de 2ème boucles...
et qu'à la fin ils additionnent les 12 résultats et me le retourne dans la console.
Voici le programme:
Auriez-vous une solution ?
Bonne journée.
,
Je veux écrire un programme python qui me permet de calculer Pi mais lors de l'exécution du programme je m'aperçois que seulement 10% du processeur et utiliser.
En me renseignant sur différents forums, j'ai vu que python n'exécutait pas les programmes sur plusieurs cœurs.
Je voulais donc savoir comment faire pour utiliser les 12 cœurs du processeur afin de gagner du temps lors de l'exécution du programme.
J'ai déjà essayé de regarder sur des forums, mais je ne suis pas parvenu à résoudre le problème. Je voulais que par exemple le 1er cœur face les 10 millions de 1ère boucles et qu'en même temps le 2ème cœur face les 10 millions de 2ème boucles...
et qu'à la fin ils additionnent les 12 résultats et me le retourne dans la console.
Voici le programme:
def test(X): P = 0 v = 1 for k in range(X): P = P + (4 / v) - (4 / (v + 2)) v = v + 4 print(P)
Auriez-vous une solution ?
Bonne journée.
A voir également:
- Multithreading python
- Citizen code python avis - Accueil - Outils
- Mot secret python pix ✓ - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Python par la pratique : 101 exercices corrigés pdf - Forum Python
- Exercice python - Forum Python
6 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, as-tu essayé de faire une recherche internet avec le titre de la discussion?
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
1 584
Je pense que tu souhaites faire du multiprocessing, pas du multithreading.
Oui j'ai déjà essayé et j'arrive sur plusieurs pages qui en parle mais je ne comprend pas grand chose.
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
ceci fonctionne chez toi?
import time import pandas as pd import multiprocessing results = [] def processData(df): """Does some compute intensive operation on the data frame. Returns a list.""" for i in range(100000): df = df * 1.0 return df.values.tolist() def collect_results(result): """Uses apply_async's callback to setup up a separate Queue for each process""" results.extend(result) if __name__ == "__main__": start_time = time.time() # Repeats the compute intensive operation on 10 data frames concurrently pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) for i in range(2): pool.apply_async(processData, args=(123, ), callback=collect_results) pool.close() pool.join() # Converts list of lists to a data frame df = pd.DataFrame(results) print(df.shape) print("--- %s seconds ---" % (time.time() - start_time))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
un exemple:
import time import multiprocessing def processData(D,F): print("d:",D, F) P=0 v=1+4*D for k in range(D,F): P=P+(4/v)-(4/(v+2)) v=v+4 print("f:",D,F) return P def collect_results(result): """Uses apply_async's callback to setup up a separate Queue for each process""" global results print(result) results+=result if __name__ == "__main__": results = 0 start_time = time.time() boucles=float(100000000) procs=4 C=int(boucles/procs) pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) for i in range(procs): pool.apply_async(processData, args=(i*C,(i+1)*C), callback=collect_results) pool.close() pool.join() print("total:",results) print("--- %s seconds ---" % (time.time() - start_time))
Bonjour,
Pour calculer
Note enfin qu'entre ton code original, voir ta fonction
Bonne chance
Pour calculer
P, tu fais moralement la somme infinie de des termes de
v_k,
kallant de
1à l'infini avec un pas de
4. Cela signifie qu'en faisant un peu de maths, tu peux directement écrire
Pcomme une somme infini qui ne dépend que de
k. Ensuite il suffit de faire un map / reduce...
import functools, multiprocessing def p(k): return 4 / (4 * k + 1) - 4 / (4 * k + 3) pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) with multiprocessing.Pool(multiprocessing.cpu_count()) as pool: pks = pool.map(p, range(10)) print(sum(pks))
Note enfin qu'entre ton code original, voir ta fonction
test(), il peut y avoir des différences dans les dernières décimales. C'est parce que dans ton code, tu cumules les erreurs d'arrondis donc attention !
Bonne chance