WindowsのPythonプロファイリング、ビルトイン機能をどのように無視しますか
-
02-10-2019 - |
質問
私はこれをオンラインでどこでも見つけることができませんでした。私はプロファイラーを使用してコードをより適切に最適化する方法を見つけたいと思っていました。また、どの機能が累積的に時間を使用するか、STR()、印刷、その他の広く使用されている機能がプロファイルの多くを食べるようなものを分類することを探していました。ユーザー定義の関数を取得するためにPythonプログラムをプロファイルするための最良の方法は何ですか?最適化できるコードの領域を確認するだけですか?
それが理にかなっていることを願っています、あなたがこの主題に流すことができるどんな光もとても感謝しているでしょう。
解決
わかりました、私はあなたを仮定します 本物 目標は、コードを合理的に可能にすることを速くすることですよね?
あなたの機能がどれだけ時間がかかるかを見つけることであなたがそれをすると仮定するのは自然ですが、それを見る別の方法があります。
プログラムが実行されると、コールツリーを追跡すると考えてください。これは、窓の外にある実際のツリーのようなものです。トランクはのようなものです main
関数、およびブランチがそこから分割する場所は、別の関数を呼び出すようなものです。
それぞれの「葉」に一定の時間がかかると仮定し、あなたがしたいのは 木を剪定します できるだけ多くの葉を取り除くように。
1つの方法は、葉がたくさんある枝を見つけて葉を切り落とすことです。もう1つの方法は、枝全体を必要としない場合に遮断することです。問題は、必要のない重い枝を見つけることです。
これを行うための骨シンプルな方法の1つは、10のようにランダムにいくつかの葉を選ぶことです。それぞれで、枝をトランクまでずっと枝に並べることです。分岐点には、葉からトランクまで、これらのラインがいくつか走っています。その分岐点を通るラインが多いほど、その枝に葉が増え、剪定することで葉が増えます。
これをプログラムに適用する方法は次のとおりです。 葉をサンプリングするには、プログラムをランダムに一時停止し、コールスタックを見ます。それがトランクに戻るラインです。各 サイトに電話します その上(関数ではなく、呼び出しサイト)は分岐点です。そのコールサイトが40%などの一部のサンプルの一部にある場合、それは剪定することで節約できる量です。
したがって、関数にかかる時間を測定すると考えないでください。どのコールサイトが「重い」かを尋ねると考えてください。それだけです。