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 :

Comment calculer le temps d'exécution avec multiprocessing ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut Comment calculer le temps d'exécution avec multiprocessing ?
    Bonjour,

    J'ai louper un passage il me semble : Comment calculer le temps d’exécution avec multiprocessing ?

    Avec time le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        t1 = time.clock()
        testw(workers, repcible, nb)
        t2 = time.clock()
        print(t2-t1)
    donne un résultat complètement faux.

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Euh, un peu plus de code, ce serait possible*?

    Parce que si testw() est asynchrone (c-à-d lance les différents processus et retourne immédiatement), c’est normal que le temps soit fantaisistement court. Par contre, si elle attend gentiment la fin de tous les processus de calcul pour retourner, je ne vois vraiment pas pourquoi les résultats seraient faux…

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Citation Envoyé par mont29 Voir le message
    Parce que si testw() est asynchrone (c-à-d lance les différents processus et retourne immédiatement), c’est normal que le temps soit fantaisistement court. Par contre, si elle attend gentiment la fin de tous les processus de calcul pour retourner, je ne vois vraiment pas pourquoi les résultats seraient faux…
    C'est bien le cas.
    Voici le code qui me pose problème (Et vous remarquerez que je ne connais pas multiprocessing)
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    def testmp(num, nb, n1, n2, rc):
        op = open
        st = str
        while num.value < nb:
            out = op(rc + "couple_" + n1 + "_" + st(num.value) + '_' + n2 + "_" +
                     st(num.value) + ".fasta", 'w')
            src1 = op(n1 + '_' + st(num.value), 'r')
            src2 = op(n2 + '_' + st(num.value), 'r')
            out.write(src1.read() + src2.read())
            src1.close()
            src2.close()
            out.close()
            num.value += 1
     
    def inittest(nb, tests):
        print('Grand ménage...')
        print('Création des répertoires cibles')
        for name in tests:
            if os.path.isdir(name):
                shutil.rmtree(name)
            os.mkdir(name)
        print('Suppression des fichiers')
        for item in os.listdir(os.getcwd()):
            if item.startswith('src'):
                os.remove(item)
        print('Création de 2 x ' + str(nb) + ' fichiers')
        letters = 'acgt'
        for index in range(0, nb):
            src1 = ''
            src2 = ''
            for i in range(1, 88):
                src1 += letters[randint(0, 3)]
                src2 += letters[randint(0, 3)]
            with open('src1_' + str(index), 'w') as f1:
                f1.write(src1 + '\n')
            with open('src2_' + str(index), 'w') as f2:
                f2.write(src2 + '\n')
     
    if __name__ == "__main__":
        nb = 10000
        tests = ['testopen', 'testmp']
        inittest(nb, tests)
        print('Début des tests')
        print('testopen:')
        repcible = os.path.join(os.getcwd(), 'testopen') + os.sep
        t1 = time.clock()
        testopen(nb, 'src1', 'src2', repcible)
        t2 = time.clock()
        print(t2-t1)
        print('testmp:')
        repcible = os.path.join(os.getcwd(), 'testmp') + os.sep
        workers = 2
        def testw(workers, repcible, nb):
            num = Value('i', 0)
            for w in range(workers):
                p = Process(target=testmp, args=(num, nb, 'src1', 'src2', repcible))
                p.start()
                p.join()
        t1 = time.clock()
        testw(workers, repcible, nb)
        t2 = time.clock()
        print(t2-t1)
    Comment attendre que tout soit fini ?

    Merci d'avance

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Ben, y a pas encore assez de code pour que je puisse le tester ( ), mais le fait d’utiliser join() casse tout parallélisme, normalement, puisque ça bloque jusqu’à ce que le processus worker retourne (donc ait fini)… Du coup, sauf erreur de ma part, ce code est totalement linéaire (worker 2 est exécuté une fois que worker 1 a fini son boulot)*!

    En quoi le résultat donné par time est-il faux, au fait*? Trop long, ou trop court*?

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par mont29 Voir le message
    Ben, y a pas encore assez de code pour que je puisse le tester ( )...
    En quoi le résultat donné par time est-il faux, au fait*? Trop long, ou trop court*?
    Voici pour le code de test
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    #! /usr/bin/env/ python
    # -*- coding: utf-8 -*-
    # 
    #
    from random import randint
    import os
    import time
    import shutil
    from multiprocessing import Process, Value, Manager
    import sys
     
    def testopen(nb, n1, n2, rc):
        op = open
        st = str
        for i in range(0, nb):
            out = op(rc + "couple_" + n1 + "_" + st(i) + '_' + n2 + "_" + st(i) +
                     ".fasta", 'w')
            src1 = op(n1 + '_' + st(i), 'r')
            src2 = op(n2 + '_' + st(i), 'r')
            out.write(src1.read() + src2.read())
            src1.close()
            src2.close()
            out.close()
     
    def testmp(lproxy, nb, n1, n2, rc):
        op = open
        st = str
        while True:
            try:
                val = lproxy.pop()
            except IndexError:
                break
            out = op(rc + "couple_" + n1 + "_" + val + '_' + n2 + "_" + val +
                     ".fasta", 'w')
            src1 = op(n1 + '_' + val, 'r')
            src2 = op(n2 + '_' + val, 'r')
            out.write(src1.read() + src2.read())
            src1.close()
            src2.close()
            out.close()
     
    def testmpmulti(lproxy, endtime, tclock, nb, n1, n2, rc):
        op = open
        st = str
        while True:
            try:
                val = lproxy.pop()
            except IndexError:
                endtime.append(tclock())
                break
            out = op(rc + "couple_" + n1 + "_" + val + '_' + n2 + "_" + val +
                     ".fasta", 'w')
            src1 = op(n1 + '_' + val, 'r')
            src2 = op(n2 + '_' + val, 'r')
            out.write(src1.read() + src2.read())
            src1.close()
            src2.close()
            out.close()
     
    def inittest(nb, tests):
        print('Grand ménage...')
        print('Création des répertoires cibles')
        for name in tests:
            if os.path.isdir(name):
                shutil.rmtree(name)
            os.mkdir(name)
        print('Suppression des fichiers')
        for item in os.listdir(os.getcwd()):
            if item.startswith('src'):
                os.remove(item)
        print('Création de 2 x ' + str(nb) + ' fichiers')
        letters = 'acgt'
        for index in range(0, nb):
            src1 = ''
            src2 = ''
            for i in range(1, 88):
                src1 += letters[randint(0, 3)]
                src2 += letters[randint(0, 3)]
            with open('src1_' + str(index), 'w') as f1:
                f1.write(src1 + '\n')
            with open('src2_' + str(index), 'w') as f2:
                f2.write(src2 + '\n')
     
    if __name__ == "__main__":
        nb = 10000
        tests = ['testopen', 'testmp', 'testmpmulti']
        inittest(nb, tests)
        print('Début des tests')
        print('testopen:')
        t1 = time.clock()
        repcible = os.path.join(os.getcwd(), 'testopen') + os.sep
        testopen(nb, 'src1', 'src2', repcible)
        t2 = time.clock()
        print(t2-t1)
        print(len(os.listdir(repcible)))
        print('testmp:')
        t1 = time.clock()
        lworkers = []
        workers = 4
        repcible = os.path.join(os.getcwd(), 'testmp') + os.sep
        manager = Manager()
        lproxy = manager.list()
        for i in range(nb):
            lproxy.append(str(i))
        for w in range(workers):
            lworkers.append(Process(target=testmp, args=(lproxy, nb, 'src1', 'src2',
                            repcible)))
        for w in lworkers:
            w.start()
        while len(lproxy) > 0:
            pass
        t2 = time.clock()
        print(t2-t1)
        time.sleep(2)
        print(len(os.listdir(repcible)))
        print('testmpmulti:')
        repcible = os.path.join(os.getcwd(), 'testmpmulti') + os.sep
        manager = Manager()
        endtime = manager.list()
        lproxy = manager.list()
        tclock = time.clock
        for i in range(nb):
            lproxy.append(str(i))
        p1 = Process(target=testmpmulti, args=(lproxy, endtime, tclock, nb, 'src1',
                     'src2', repcible))
        p2 = Process(target=testmpmulti, args=(lproxy, endtime, tclock, nb, 'src1',
                     'src2', repcible))
        p3 = Process(target=testmpmulti, args=(lproxy, endtime, tclock, nb, 'src1',
                     'src2', repcible))
        p4 = Process(target=testmpmulti, args=(lproxy, endtime, tclock, nb, 'src1',
                     'src2', repcible))
        p1.start()
        p2.start()
        p3.start()
        p4.start()
        while any((p1.is_alive(), p2.is_alive(), p3.is_alive(), p4.is_alive())):
            pass
        print(max(endtime)) # A revoir
        print(len(os.listdir(repcible)))
    Le souci c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        t1 = time.clock()
        p = (Process(...))
        ...
        t2 = time.clock()
        print(t2-t1)
    Mesure le temps du bloc entre t1 et t2, pas le temps des process.
    Ce que je recherche c'est le calcul du temps des process sans passer par un while (là je calcule le temps du while en fait) et plus 'propre' que dans testmpmulti.

    @+

  6. #6
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Eh bien, il suffit d’encadrer le contenu de tes target avec le motif

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        t1 = time.clock()
        ...
        t2 = time.clock()
        endtime.append(t2-t1)

    … Non*?

    Ou alors, tu utilises os.times(), qui renvoie un tupple dont les deux premiers membres sont les temps utilisateur et noyau du processus courant, en mettant par exemple à la fin de ta fonction target*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        tms = os.times()
        endtime.append(tms[0] + tms[1])

Discussions similaires

  1. Réponses: 19
    Dernier message: 03/06/2013, 19h04
  2. Comment calculer le temps d'exécution d'une fonction
    Par gege2061 dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 16h19
  3. Réponses: 4
    Dernier message: 07/01/2010, 13h14
  4. Réponses: 5
    Dernier message: 07/04/2007, 01h49
  5. comment calculer le temps d'execution
    Par passion_info dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/06/2005, 09h13

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