Salut à tous
Petite question sur une mesure de performance.
Ce sur quoi je travaille : une liste d'éléments. Sur chacun des éléments, j'ai :
1) un traitement à faire
2) un test pour savoir si je dois appliquer par la suite un autre traitement à cet élément
Donc là tout de suite, 2 possibilités :
Soit je fais une boucle for et pour chaque élément je fais les 2 étapes, soit je fais en 2 passes (donc avec 2 boucles).
Et à mon plus grand étonnement, le code avec 2 boucles est plus performant ! ...
J'ai essayé avec ce code-exemple là :
Sur ma machine ça donne :
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 from time import time L = 100000 N = 100 def f1(L): liste=list(range(-L,L)) for i in range(len(liste)) : liste[i]*=2 to_treat = [] for elt in liste : if elt > 0 : to_treat.append(elt) return to_treat def f2(L): to_treat = [] liste=list(range(-L,L)) for i in range(len(liste)) : liste[i]*=2 elt = liste[i] if elt > 0 : to_treat.append(elt) return to_treat t0 = time() for _ in range(N): f1(L) t1 = time() for _ in range(N): f2(L) t2 = time() print("--- Exec time ---") print("1 for loop: ", t1-t0) print("2 for loops: ", t2-t1)
Sur un compilo en ligne (https://repl.it/languages/python3), la différence est pire meme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 --- Exec time --- 1 for loop: 3.3593356609344482 2 for loops: 3.650329828262329 --- Exec time --- 1 for loop: 3.362551689147949 2 for loops: 3.713728666305542 --- Exec time --- 1 for loop: 3.353935480117798 2 for loops: 3.6981289386749268
Vu que cela donne pareil chez moi, et en ligne, j'en déduis que cela ne dépends pas de ma machine (mais je vous invite à tester aussi si vous le voulez bien pour confirmer).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 --- Exec time --- 1 for loop: 18.116057634353638 2 for loops: 23.102251768112183 --- Exec time --- 1 for loop: 20.035600185394287 2 for loops: 26.916467428207397
Là où est la question, c'est que je me serais attendu à ce qu'un double passage soit plus couteux qu'un simple passage... Une explication ?
Partager