Bonjour à toutes et à tous,

Je précise d'emblée que je suis très débutant en Python, mais que je m'instruit.
Je cherche à mesurer finement le temps d’exécution d'une fonction() quelconque en fonction:
  • du nombre de processeurs utilisés
  • du pourcentage de données utilisé pour le calcul

Plus précisément, je suis intéressé par la médiane des temps de calcul (pour un certain nombre de répétitions afin d'obtenir une estimation fine).
Après avoir parcouru pas mal le net, j'arrive à produire un code minimal qui fonctionne plus ou moins. Je n'arrive toutefois pas à exécuter la fonction de manière synchrone. En fait j'utilise bien pool.apply() mais l’exécution semble être asynchrone car le print() est appelé avant même que le vecteur time[] ne soit rempli, ce que je ne m'explique pas (je comprends sans doute mal l'utilisation du package multiprocessing).

J'ai également essayé d'autres manières de faire, notamment avec with Pool(processes=4) as pool: mais sans succès. Pouvez-vous m'éclairer?

Un exemple minimal est fourni ici:
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
# packages
import pandas as pd
import numpy as np
import timeit
from statsmodels.formula.api import ols
import multiprocessing as mp
 
# fonction à tester
def fonctionq(x, y, sim):
    def boucle(x, y):
        x2 = np.random.randn(len(x))
        data = pd.DataFrame({'X': x2, 'Y': y})
        return (max(abs(ols('X ~ Y', data=data).fit())))
 
# données
D = [[3, 2], [6,10], [10,8], [12,15], [1,0], [3,5], [15,12], [12,24]]
data = pd.DataFrame(D)
 
# paramètres
nbr = 150  # Nombre de simulations
t = 100  # Nombre de répétitions
percents = list(range(10, 101, 10))  # Pourcentage de données utilisées
 
# Benchmark
n = len(data)
time = []
for c in range(4):
    if __name__ == '__main__':
        pool = mp.Pool(c + 1)
        for p in percents:
            data2 = data.sample(int((p / 100) * n))
            time.append(np.median(timeit.repeat("pool.apply(fonctionq, args=(data2.iloc[:, 0], data2.iloc[:, 1], nbr))", globals=locals(), number=1, repeat=t)))
        pool.close()
        pool.join()
 
print(time)
Et donne par exemple comme résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[0.0005699500000000413, 0.0005136999999999503, 0.0005140000000000144, 0.0005127999999999799, 0.0005095999999998879, 0.0005151500000000198, 0.00041279999999999095, 0.00042349999999991006, 0.00042324999999998614, 0.00042204999999995163, 0.000545600000000146, 0.0004846499999999754, 0.00044050000000006584, 0.0004443000000000641, 0.000446949999999946, 0.0005021000000000608, 0.00045770000000011635, 0.000437600000000149, 0.00043624999999991587, 0.00042879999999989593, 0.0005235999999999574, 0.00043039999999994194, 0.00042809999999970927, 0.0004294499999999424, 0.00042729999999968626, 0.0004200499999997831, 0.0004208500000002502, 0.00042020000000064783, 0.00042019999999975965, 0.0004203500000001803, 0.0005252000000002255, 0.0004476499999999106, 0.00045410000000023487, 0.00044375000000007603, 0.00043755000000000877, 0.00043805000000007865, 0.0004298500000001759, 0.00043020000000026926, 0.0004302499999999654, 0.0004334000000003613]
A noter que j'utilise Anaconda3 si ca peut être d'une quelconque utilité?

Merci!