2016-11-03 1 views
13

Je suis caractérisez un script python main.py en utilisant cprofile avec la commande suivante:Quelle est la différence entre tottime et cumtime dans un script python profilé avec cProfile?

python -m cProfile -s tottime main.py 

La sortie que je reçois est (seulement copier-collé les premières lignes de la sortie):

10184337 function calls (10181667 primitive calls) in 13.597 seconds 

Ordered by: internal time 

ncalls tottime percall cumtime percall filename:lineno(function) 
    1 4.674 4.674 13.598 13.598 main.py:2(<module>) 
2142 2.964 0.001 4.663 0.002 load_aerdat3.py:61(getPacket) 
    459 2.381 0.005 2.381 0.005 {waitKey} 
1667989 1.170 0.000 1.170 0.000 {numpy.core.multiarray.array} 

... 

Comment le tottime (4.674) est différent du cumtime (13.598) pour main.py, puisque cette fonction (c'est-à-dire le script entier) est seulement appelée une fois?

Répondre

15

tottime est le temps total passé dans la seule fonction. cumtime est le temps total passé dans la fonction plus toutes les fonctions que cette fonction a appelées.

Les deux valeurs vont être les mêmes si une fonction n'appelle jamais rien d'autre. Par exemple, {waitKey} ne semble pas invoquer toute autre chose:

459 2.381 0.005 2.381 0.005 {waitKey} 

mais getPacket() appels d'autres fonctions, il est donc colonne cumtime inclut le temps pour les appels:

2142 2.964 0.001 4.663 0.002 load_aerdat3.py:61(getPacket) 

La ligne main.py couvre tout le code courir en dehors des fonctions, le code global; juste les instructions à ce niveau ont pris 4.674 secondes pour s'exécuter, mais parce que ces instructions ont appelé d'autres fonctions, le temps cumulé total du main.py code plus tous les appels de fonction effectués est 13.598 secondes.

De l'documentation:

tottime
pour le temps total passé dans la fonction donnée (et à l'exclusion du temps fait des appels à des sous-fonctions)

[...]

cumtime
est le temps cumulé passé dans cet élément et dans tous les sous-éléments. ons (de l'invocation à la sortie). Cette figure est précise même pour les fonctions récursives.

+0

super, maintenant je comprends! en quelque sorte j'ai raté que 'tottime' n'inclut pas les sous-fonctions .. Merci! – takahashi