1

コードの一部をプロファイリングするためにPythonプロファイラーstatprofを使用しようとしました。ドキュメントには、プロシージャが複数回発生した場合、1回だけカウントされると記載されています。ただし、プロファイルの出力では、行番号が異なる同じプロシージャが複数回発生していることがわかります。誰かがこれが何を示しているのか考えていますか?

例:出力

  0.00      0.01      0.00  box.py:1305:**do_forever**

  0.00      0.01      0.00  httplib.py:981:_send_request

  0.00      0.01      0.00  box.py:1295:**do_forever**

  0.00      0.01      0.00  box.py:1295:**do_forever**

  0.00      0.01      0.00  sre_compile.py:486:_code

  0.00      0.01      0.00  box.py:923:get_user_file_info

  0.00      0.00      0.00  box.py:776:update_all_internal_user_stats_batch
4

1 に答える 1

1

ドキュメントを見たところ、単一のスタックサンプルでプロシージャが複数回発生した場合、1回だけカウントされると書かれています。(ここでは、「手順」という用語は、実際には「手順内のコード行」であるべきだと思います。)

つまり、再帰が行われている場合、関数の時間コストが再帰の深さによって人為的に増幅されることは望ましくありません。

また、他にもいくつか指摘します(詳細はこちらで説明しています):

最初の列は、子供を数えない「% 時間」、つまり自己パーセントです。プロシージャ コールでないものはほとんどないため、これは役に立たない統計です。行を見れば、それがプロシージャ コールであるかどうかがわかります。

2列目は子供を含めた「累積時間」です。それは問題ありませんが、合計時間で割る必要がないように、パーセントにする必要があります。数が重要である理由は、そのラインが何を担当しているかを表しているためです。つまり、そのラインが存在しない場合に節約できる合計時間の割合です。

3 番目の列は「セルフタイム」です。これは、私が説明したように、役に立たない統計です。それが極端に小さいかゼロであるという事実は、その役に立たないことを反映しています。累積時間に含まれているので、極端に少なくなければ累積時間にも表示されるので、累積時間にないことは何もわかりません。

また、著者が指摘するように、サンプルは I/O 中に中断されるため、ライブラリの奥深くで、望まない、または要求しない I/O を実行している場合、およびそれがプログラムを 100 回実行している場合そうでない限り、プロファイラー (およびあなた) はそれをまったく認識しません。

于 2012-08-06T14:56:17.350 に答える