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 :
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.
Pour le calcul en pool j'obtient les sorties :
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.
Autrement dit pour le calcul en pool :
- 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?

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()
Merci d'avance
Cordialement