Bonjour,
J'ai un problème avec le multi processing de python. Dans le fichier joint j'implémente une fonction (fonction def isperfect(n):) de deux façons soit séquentiellement (def calcul_non_par(m):) soit en parallélisme par multi processing en pool (def calcul_par_pool(m, t):) avec respectivement un pool de 1, 4, 8 et 12 process.
J'exécute les deux calculs pour 10000 valeurs pour comparer la rapidité des process séquentiel et parallèle.
Pour le calcul séquentiel j'obtiens la sortie suivante :
Pour le calcul en pool j'obtient les sorties :6 is a perfect number
28 is a perfect number
496 is a perfect number
8128 is a perfect number
Calcul séquentiel done in 3.1599 seconds.
Autrement dit pour le calcul en pool :temps de calcul par 1 pool 6.229550838470459
temps de calcul par 4 pool 4.26444411277771
temps de calcul par 8 pool 4.470384836196899
temps de calcul par 12 pool 4.848342657089233.
- je n'obtiens pas les impressions intermédiaires que je devrais obtenir lors de l'appel de la fonction isperfect(n).
- le calcul parallèle en pool est toujours plus long que le calcul classique non parallèle (alors que ça devrait être l'inverse).
J'ai également essayé le multi processing en faisant appel à la fonction process mais c'est encore plus long en temps de calcul.
Où est-ce que je fais quelque chose qui ne va pas? Quelqu'un peut-il m'aider?
Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 import time import multiprocessing from multiprocessing import Pool def isperfect(n): sumfactors = 0 for i in range(1, n): if (n % i == 0): sumfactors = sumfactors+i if (sumfactors == n): print('{} is a perfect number'.format(n)) def calcul_non_par(m): tic = time.time() for n in range(1, m): isperfect(n) toc = time.time() print('Calcul sequentiel done in {:.4f} seconds'.format(toc-tic)) def calcul_par_pool(m, t): nbprocess = t debut = time.time() pool = Pool(t) pool.map(isperfect, range(1, m)) pool.close() fin = time.time() print("temps de calcul par", t, "pool", fin - debut) def main(): m = 10000 # 00 # 000 # 000 # 00 # 00 # 000 # ☺5000 # ♦000 # 0000 resultat1 = calcul_non_par(m) if __name__ == '__main__': resultat2 = calcul_par_pool(m, 1) resultat3 = calcul_par_pool(m, 4) resultat4 = calcul_par_pool(m, 8) resultat5 = calcul_par_pool(m, 12) main()
Cordialement
Partager