2017-08-31 2 views
0

Le code python ci-dessous tente d'exécuter la même fonction deux fois et sorties du moteur d'exécution:Pourquoi exécuter la même fonction avec la même entrée deux fois perdre du temps différent sur python?

def test_f(f1,ip): 
    st = time.time() 
    f1(*ip) 
    print(time.time()-st) 

test_f(math.sin,[100]) 
test_f(math.sin,[100]) 

Les sorties de trois essais sont ci-dessous:

7.15255737305e-06 
1.19209289551e-06 

7.86781311035e-06 
9.53674316406e-07 

6.91413879395e-06 
9.53674316406e-07 

Je ne sais pas pourquoi les sorties sont si différents ? Pourquoi la seconde exécution est plus rapide que la première? J'essaie aussi de courir cinq fois, et les résultats sont ci-dessous:

8.10623168945e-06 
1.19209289551e-06 
0.0 
0.0 
0.0 
+2

'time' par rapport aux autres méthodes de temporisation n'est pas très précis. Essayez d'exécuter notre test en utilisant 'timeit.timeit' à la place. –

Répondre

1

En CPython, Lorsqu'un module est compilé, un objet de code est créé (qui contient le code d'octets), mais un appel de fonction réelle nécessite une objet frame (qui implique une allocation et une initialisation au moment de l'exécution). En tant qu'optimisation, ces objets de cadre sont parfois maintenus en vie en tant que "zombies" pour une réutilisation ultérieure. Voici une partie d'un vaste commentaire dans la source pour frameobject.c:

/* Stack cadres sont alloués et désallouées à un taux considérable. Pour tenter d'améliorer la vitesse de la fonction appelle, nous:

Si ce que vous observez est pas un simple artefact de la non-fiabilité de time.time à cette résolution, il est la différence de temps entre la création un zombie (plus lent) et réanimer un zombie (plus rapide).