2016-06-28 6 views
1

私は現在、(特に)cProfileを使ってPythonでいくつかのプロファイリング作業を行っています。 documentationでは、それは言う:決定論的なプロファイラはなぜ「決定論的」と呼ばれていますか?

cProfileとプロファイルが

プロファイリングの間、Pythonプログラムの決定論的プロファイリングを提供し、私は、全体のプログラムのためだけでなく、個々の機能のためにcProfileとわずかに異なる結果を得続けます。そして、それは問題ありません。私は、少なくともいくつかの理由を理解していると思います。たとえば、いくつかのOSタスクがバックグラウンドで実行され、プログラムが遅くなる可能性があります。 cProfileはCPU時間ではなくリアルタイムで動作します。

しかし、それでも、同じ結果が毎回発生しない場合、なぜ確定的プロファイリングと呼ばれるのですか?

+0

[文書を下にスクロール](https://docs.python.org/2/library/profile.html#what-is-deterministic-profiling) – Pointy

+0

10セントの単語です概念。これは測定があなたのスピードアップを見つけるのに役立つという空虚な仮定に基づいています。そこからあなたの目的を忘れて、代わりに測定の正確さ*に集中することは、愚かな一歩です。このサイトの多くのハード・プログラマーは、その違いを知っています。 [*ここに浮かんでいる馬鹿なアイデアのいくつかは、実際に動作します*](http://stackoverflow.com/a/1779343/23771) –

+0

10ドル対10セント:) 投稿、一見すると興味深いようです。 –

答えて

0

質問がdocumentationに答えている:

27.4.5。決定論的プロファイリングとは何ですか?

確定的プロファイリングは、すべての関数呼び出し、関数の戻り値、および例外イベントが監視され、これらのイベントの間隔(ユーザーのコードが実行されている間)に対して正確なタイミングが取られていることを反映します。対照的に、統計的プロファイリング(これはこのモジュールによって行われない)は、実効命令ポインタをランダムにサンプリングし、時間がどこで費やされているのかを推測します。後者の手法では伝統的にオーバヘッドは少なくなります(コードをインスツルメンテーションする必要がないため)が、時間が費やされている場所の相対的な指標のみを提供します。

Pythonでは、実行中にインタプリタがアクティブなので、インストルメント済みコードの存在が確定的なプロファイリングを行う必要はありません。 Pythonは自動的に各イベントのフック(オプションのコールバック)を提供します。さらに、Pythonの解釈された性質は、実行に多大なオーバーヘッドを加える傾向があり、決定論的なプロファイリングは、典型的なアプリケーションでは小さな処理オーバーヘッドを追加する傾向があります。その結果、決定論的プロファイリングはそれほど高価ではなく、Pythonプログラムの実行に関する広範な実行時統計を提供します。

コールカウント統計は、コード内のバグ(驚くべきカウント)を特定し、可能なインライン展開ポイント(コール数が多い)を識別するために使用できます。内部時刻統計は、慎重に最適化されるべき「ホットループ」を識別するために使用できます。累積時間統計は、アルゴリズムの選択における高レベルエラーを識別するために使用されるべきである。このプロファイラでの累積時間の異常な処理により、アルゴリズムの反復実装の統計を反復実装と直接比較することができます。

つまり、いくつかのサンプリングに依存せず、同じ条件下でデータを再現する必要があります。

+0

ああ、「決定論的」という用語は統計的なプロファイラーと区別するために使われていますか?私はそれが単なる意味論的な問題だと思うが、 '決定論的な'プロファイラが同じ入力に対して異なる結果を返すという事実は、間違った方法で私を擦る。 cProfileが実時間ではなく実際にCPU時間を測定した方が意味があります。ああも.....しかし、とにかく答えるために感謝! –

関連する問題