IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Probleme avec multiprocessing de python


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Février 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2022
    Messages : 2
    Par défaut 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 :
    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

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 817
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par outlier Voir le message
    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?
    J'ai recopié ton code sans rien y changer et voici le résultat
    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
    moi@debian10:/tmp$ ./essai.py 
    6 is a perfect number
    28 is a perfect number
    496 is a perfect number
    8128 is a perfect number
    Calcul sequentiel done in 2.2144 seconds
    6 is a perfect number
    28 is a perfect number
    496 is a perfect number
    8128 is a perfect number
    temps de calcul par 1 pool 2.2259695529937744
    6 is a perfect number
    28 is a perfect number
    496 is a perfect number
    8128 is a perfect number
    temps de calcul par 4 pool 0.6565380096435547
    6 is a perfect number
    28 is a perfect number
    496 is a perfect number
    8128 is a perfect number
    temps de calcul par 8 pool 0.6083595752716064
    6 is a perfect number
    28 is a perfect number
    496 is a perfect number
    8128 is a perfect number
    temps de calcul par 12 pool 0.5702731609344482
    moi@debian10:/tmp$
    Ca me semble assez cohérent...

    Note: j'ai fait ce test sur un Linux Debian.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Citation Envoyé par outlier Voir le message
    Où est-ce que je fais quelque chose qui ne va pas? Quelqu'un peut-il m'aider?
    Probable que vous tournez sur Windows.

    A la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def main():
        m = 10000  # 00  # 000  # 000  # 00  # 00  # 000  # ☺5000  # ♦000  # 0000
        resultat1 = calcul_non_par(m)
        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()
    écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if __name__ == '__main__':
        m = 10000  # 00  # 000  # 000  # 00  # 00  # 000  # ☺5000  # ♦000  # 0000
        resultat1 = calcul_non_par(m)
        resultat2 = calcul_par_pool(m, 1)
        resultat3 = calcul_par_pool(m, 4)
        resultat4 = calcul_par_pool(m, 8)
        resultat5 = calcul_par_pool(m, 12)
    les détails sont dans la documentation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Février 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2022
    Messages : 2
    Par défaut Merci à tous
    Merci à tous
    Effectivement je tourne sur windows avec spyder et anaconda.
    Le fait de placer le if __name__ == '__main__':
    en tout début du main et non en position intermédiaire a résolu le problème du temps de calcul.
    En revanche le problème des prints intermédiaires qui n'apparaissent pas existe toujours. Mais je crois que c'est dû à spyder. En effet quand je fais tourner le code dans une fenêtre exécutable directement avec python.exe les prints apparaissent.
    Quelqu'un connaitrait il la solution pour contourner ce problème sur spyder?
    Merci d'avance

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 817
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par outlier Voir le message
    Le fait de placer le if __name__ == '__main__':
    en tout début du main et non en position intermédiaire a résolu le problème du temps de calcul.
    C'est bizarre. Ok il n'était pas super bien placé mais dans le cas d'un appel direct de ton code, ça ne change rien. D'ailleurs quand je dis que j'avais repris ton code sans rien y changer, c'était valable aussi pour cette partie.

    Citation Envoyé par outlier Voir le message
    Mais je crois que c'est dû à spyder.
    Même pas
    Nom : VirtualBox_Debian10_64b_21_01_2022_17_14_43.png
Affichages : 205
Taille : 216,4 Ko
    Mais là encore c'est sur Debian.

    Citation Envoyé par outlier Voir le message
    Quelqu'un connaitrait il la solution pour contourner ce problème sur spyder?
    Moi je te dirais: utilise spyder si tu le souhaites mais uniquement pour mettre au point ton code. Et quand le programme te semble correct, teste-le directement sans intermédiaire. Tu ouvres une fenêtre MsDos et là tu appelles python programme.py ou directement programme.py si Python est dans le PATH. Après-tout, c'est ça le but d'un code Python => être utilisable directement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Citation Envoyé par outlier Voir le message
    Quelqu'un connaitrait il la solution pour contourner ce problème sur spyder?
    Un problème n'existe que si on le reproduit en lançant le programme depuis un terminal et avec la commande Python (son environnement d'exécution "normal").

    Un IDE est fait pour fabriquer un programme pas pour l'exécuter sauf dans les étapes de mises au point.
    Pour ce faire il crée un environnement d'exécution spécifique qui pourra avoir un comportement différent de l'environnement "normal".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Python 3.X] problem avec GetrasterBand sous python 3
    Par loula05 dans le forum Général Python
    Réponses: 20
    Dernier message: 07/01/2019, 22h33
  2. probleme avec If et Else avec python 3
    Par pgu19 dans le forum Général Python
    Réponses: 6
    Dernier message: 04/09/2011, 13h37
  3. probleme avec variable d'environnement pour python
    Par k_boy dans le forum Général Python
    Réponses: 4
    Dernier message: 24/07/2011, 01h41
  4. Probleme avec l'installation du module SOAPpy sous Python 2.5
    Par soufian2290 dans le forum Déploiement/Installation
    Réponses: 4
    Dernier message: 14/10/2008, 12h49
  5. Réponses: 4
    Dernier message: 10/02/2006, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo