web-dev-qa-db-ja.com

python cProfileでプロファイルされたスクリプトのtottimeとcumtimeの違いは何ですか?

私はpython script main.pyを次のコマンドでcProfileを使用してプロファイリングしています:

python -m cProfile -s tottime main.py

私が得る出力は次のとおりです(出力の一番上の行をコピーアンドペーストするだけです):

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}

...

tottime(4.674)は、main.pycumtime(13.598)とどのように異なることができますか?この関数(つまり、スクリプト全体)は1回しか呼び出されないためです。

48
takahashi

tottimeは関数のみで費やされた合計時間ですcumtimeは、関数で費やされた合計時間plusこの関数が呼び出したすべての関数です。

関数が他に何も呼び出さない場合、2つの値は同じになります。たとえば、_{waitKey}_は他の何かを呼び出すようには見えません:

_  459    2.381    0.005    2.381    0.005 {waitKey}
_

ただし、getPacket()は他の関数を呼び出すため、cumtime列にはそれらの呼び出しの時間が含まれます。

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

_main.py_行は、関数の外側で実行されるすべてのコード、グローバルコードをカバーしています。そのレベルのステートメントの実行には4.674秒しかかかりませんでしたが、これらのステートメントは他の関数を呼び出すため、_main.py_コードとすべての関数呼び出しの累積時間の合計は13.598秒。

ドキュメント から:

tottime
指定された関数で費やされた合計時間(およびサブ関数の呼び出しで行われた時間を除く)

[...]

cumtime
は、このサブ関数およびすべてのサブ関数(呼び出しから終了まで)で費やされた累積時間です。この数値は、再帰関数に対しても正確です。

72
Martijn Pieters