Bonjour à tous,

J’ai scripté en python une analyse financière et je cherche à optimiser les temps de traitement.
Après quelques recherches, je suis tombé sur la librairie "multiprocessing" qui semble être la mieux adaptée à ce que je recherche.
Je ne sais pas trop comment m'y prendre pour implémenter tout ça et je ne suis pas sûr que ce soit le bon choix...

Dans ce programme, je charge un cube XBasesX (list à 3 dimensions) à partir d'une base de données.

# Dimension 1 : les courses de l'hippodrome (560 courses du meeting d'hiver 2017 à Vincennes en attelé)
# Dimension 2 : les chevaux de la course (de 9 à 20 partants, par défaut, j'ai fixé cette dimension à 20, c'est peut-être une erreur pour l'optimisation)
# Dimension 3 : les rubriques des chevaux et les zones de travail (14 rubriques de classements qualificatifs indices 4 à 17, les indices 0 à 3 et 18 servent aux calculs et 19 au stockage des rapports)

Voici la fonction que j'appelle en lui donnant en paramètres les coefficients multiplicateurs à appliquer à chacune des rubriques, cette fonction appelle aussi en fin de traitement une autre fonction qui enregistre le résultat de l'analyse si le bilan financier s'est amélioré.

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
# Fonction de traitement d'un cycle complet sur le cube
def CycleToutesCourses(CoefRub):
    global XBasesX
    global NbCycles
    global LieuCourse
    global Discipline
    global SvNbCoursesGains
    global SvMontantGains
    # Initialisation des zones de calcul pour le bilan financier
    NbCoursesGains = 0
    MontantGains = 0
    MontantJeux = 0
    CptEcartMoyen = 0
    CptEcartMaxi = 0
    Z4Calcules = 0
    EcartMoyen = 0
    EcartMaxi = 0
    Ecart = 0
    # on boucle sur les courses charges dans XBasesX
    for BasesX in XBasesX:
        # Calcul des points cumulés pour chaque cheval de la course lignes 0 à 19
        for Bases in BasesX:
            # Cumul des 14 rubriques colonnes 3 à 17
            for Rub in range(0,14):
                Bases[3] = Bases[3] + (CoefRub[Rub] * Bases[Rub + 4])
        # Tri préalable sur colonne 8 classement ClaStatsCombi
        BasesX = sorted(BasesX, key=itemgetter(8))
        # Tri sur colonne 3 Cumul des valeurs dégressives de 5 à 1 points pour les 5 premiers des classements de chaque rubriques
        BasesX = sorted(BasesX, key=itemgetter(3), reverse=True)
        # Bilan Z4 combiné 8 chevaux 70€
        MontantJeux += 70
        Z4 = 0
        for i in range(0,9):
            if BasesX[i][2] == 1 or BasesX[i][2] == 2 or BasesX[i][2] == 3 or BasesX[i][2] == 4:
                Z4 += 1
        if Z4 == 4:
            NbCoursesGains += 1
            if BasesX[0][19] > 0:
                MontantGains = MontantGains + BasesX[0][19]
            else:
                # Gains approximatifs calculés lorsque le rapport du Z4 est inconnu 
                if (BasesX[1][19] * BasesX[2][19] * BasesX[3][19] / 10) > 0:
                    MontantGains = MontantGains + (BasesX[1][19] * BasesX[2][19] * BasesX[3][19] / 10)
                else:
                    # 80 € par défaut si incalculable
                    MontantGains = MontantGains + 80
                Z4Calcules += 1
            if CptEcartMaxi > EcartMaxi:
                EcartMaxi = CptEcartMaxi
            EcartMoyen = EcartMoyen + CptEcartMoyen
            if CptEcartMoyen != 0:
                Ecart += 1
            CptEcartMoyen = 0
            CptEcartMaxi = 0
        else:
            CptEcartMoyen += 1
            CptEcartMaxi += 1
        # on sort du cycle sous les conditions suivantes =>
	    # Au bout 10 courses analysées, si moins de 2 courses ont été pronostiquées
	    # Au bout 20 courses analysées, si moins de 5 courses ont été pronostiquées 
	    # Au bout 50 courses analysées, si moins de 11 courses ont été pronostiquées 
	    # Au bout 100 courses analysées, si moins de 21 courses ont été pronostiquées 
        # Si l'écart maximum est supérieur à 10
        if (MontantJeux > 630 and NbCoursesGains < 2) or (MontantJeux > 1330 and NbCoursesGains < 5) or (MontantJeux > 3430 and NbCoursesGains < 11) or (MontantJeux > 6930 and NbCoursesGains < 21) or EcartMaxi > 10:
            break
    # Enregistrement du bilan financier dans Parametres
    # Si le montant des gains ou le nombre de courses gagnées s'est amélioré
    if NbCoursesGains > SvNbCoursesGains or MontantGains > SvMontantGains:
        if EcartMoyen > 0:
            EcartMoyen = round(EcartMoyen / Ecart, 2)
        EnregistreParam(CoefRub,EcartMoyen,EcartMaxi,NbCourses,NbCoursesGains,MontantJeux,MontantGains,Z4Calcules)
        print(NbCycles," - ",strftime("%Y%m%d %H:%M",gmtime())," - ",CoefRub," - NbCG=",NbCoursesGains," - Gains=",MontantGains," - Z4C=",Z4Calcules)
        if NbCoursesGains > SvNbCoursesGains:
            SvNbCoursesGains = NbCoursesGains
        if MontantGains > SvMontantGains:
            SvMontantGains = MontantGains
    else:
        if NbCycles % 50000 == 0:
            print(NbCycles," - ",strftime("%Y%m%d %H:%M",gmtime())," - ",CoefRub," - NbCG=",NbCoursesGains," - Gains=",MontantGains," - Z4C=",Z4Calcules)
Et j'appelle cette fonction à partir de cette boucle où je fais varier les coefficients multiplicateurs en boucles imbriquées :

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
# Boucles de calcul de l'analyse financière
SvNbCoursesGains = 0
SvMontantGains = 0
NbCycles = 0
# Rubrique CX ***
for ClaCX in range(0,3):
    # Rubrique CRI ***
    for ClaCRIFX in range(0,3):
        # Rubrique FOR ***
        for IndForme in range(0,3):
            # Rubrique GEN ***
            for ClaTMatic in range(0,3):
                # Rubrique STR ***
                for ClaStatsCombi in range(0,3):
                    # Rubrique DRI ***
                    for ClasRD in range(0,3):
                        # Rubrique ENT ***
                        for ClasRE in range(0,3):
                            # Rubrique CM ***
                            for ClaCote in range(0,3):
                                # Rubrique REU ***
                                for ClasCoefReussite in range(0,3):
                                    # Rubrique AR ***
                                    for ClaAR in range(0,3):
                                        # Rubrique OR ***
                                        for ClaOR in range(0,3):
                                            # Rubrique RUB ***
                                            for ClaRub in range(0,3):
                                                # Rubrique HIS ***
                                                for ClaHisto in range(0,3):
                                                    # Rubrique ST ***
                                                    for ClasStats in range(0,3):
                                                        # Liste des coefficients des 14 rubriques
                                                        CoefRub = [ClaCX,ClaCRIFX,IndForme,ClaTMatic,ClaStatsCombi,ClasRD,ClasRE,ClaCote,ClasCoefReussite,ClaAR,ClaOR,ClaRub,ClaHisto,ClasStats]
                                                        NbCycles += 1
                                                        CycleToutesCourses(CoefRub)
Déjà, si vous avez des suggestions pour optimiser au maximum ce code, je suis preneur.

D'autre part, l'un d'entre vous pourrait-il m'aider à implémenter le "multiprocessing" sur ce code s.v.p.

Jusqu'à maintenant j'ai pu faire varier mes coefficients multiplicateurs de 0 à 2, ce traitement dans cette configuration a duré moins de 10 heures.
Mais je souhaiterais les faire varier de 0 à 5 et là, selon mes calculs, j'en ai pour plusieurs dizaines d'années !

Merci de votre aide. Tchicken.