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à :

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 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
--- 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
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
--- Exec time ---
1 for loop:   18.116057634353638
2 for loops:  23.102251768112183
 
--- Exec time ---
1 for loop:   20.035600185394287
2 for loops:  26.916467428207397
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).
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 ?