Probleme avec multiprocessing de python
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 :
Citation:
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 :
Citation:
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:
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