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:
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
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)
A noter que j'utilise Anaconda3 si ca peut être d'une quelconque utilité?
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]
Merci!
Partager