web-dev-qa-db-fra.com

Quelle est la différence entre tottime et cumtime dans un script python profilé avec cProfile?

Je profile un python main.py en utilisant cProfile avec la commande suivante:

python -m cProfile -s tottime main.py

La sortie que j'obtiens est (seulement copier-coller 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}

...

En quoi le tottime (4.674) peut-il être différent du cumtime (13.598) pour main.py, puisque cette fonction (c'est-à-dire l'ensemble du script) n'est appelée qu'une seule fois?

48
takahashi

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

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

  459    2.381    0.005    2.381    0.005 {waitKey}

mais getPacket() appelle d'autres fonctions, c'est donc la colonne cumtime qui inclut l'heure de ces appels:

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

La ligne main.py Couvre tout le code exécuté en dehors des fonctions, le code global; seules les instructions à ce niveau ont pris 4 674 secondes pour s'exécuter, mais comme ces instructions appelaient d'autres fonctions, le temps cumulé total du code main.py plus tous les appels de fonction effectués est de 13,598 secondes.

De la documentation :

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

[...]

cumtime
est le temps cumulé passé dans cette fonction et toutes les sous-fonctions (de l'invocation à la sortie). Ce chiffre est précis même pour les fonctions récursives.

72
Martijn Pieters