4

私はこれをオンラインのどこでも見つけることができませんでした。私はプロファイラーを使用してコードをより適切に最適化する方法を探していました。どの関数が累積的に最も時間を消費するかで並べ替えると、str()、print、およびその他の同様の広く使用されている関数がプロファイルの多くを消費します。Pythonプログラムをプロファイリングして、ユーザー定義関数を取得し、コードのどの領域を最適化できるかを確認するための最良の方法は何ですか?

私はそれが理にかなっていることを願っています、あなたがこの主題に当てることができるどんな光でも非常にありがたいです。

4

1 に答える 1

8

OK、あなたの本当の目標は、コードをできるだけ速くすることだと思いますよね?

関数にかかる時間を調べることでそれを行うと想定するのは自然なことですが、それを見る別の方法があります。

プログラムを実行すると、ウィンドウの外にある実際のツリーのような呼び出しツリーがトレースされると考えてください。トランクはmain関数のようなものであり、ブランチが分岐する場所は別の関数を呼び出すようなものです。

それぞれの「葉」に一定の時間がかかり、できるだけ多くの葉を取り除くために木を剪定したいとします。

一つの方法は、葉がたくさんある枝を見つけて、葉を切り落とすことです。もう1つの方法は、必要がない場合はブランチ全体を切り取る方法です。問題は、必要のない重い枝を見つけることです。

これを行うための骨の簡単な方法の1つは、10枚など、ランダムにいくつかの葉を選び、それぞれについて、その枝から幹までの線をトレースすることです。どの分岐点にも、葉から幹まで、いくつかのこれらの線が走っています。その分岐点を通る線が多いほど、その枝にある葉が多くなり、剪定することで節約できます。

これをプログラムに適用する方法は次のとおりです。リーフをサンプリングするには、プログラムをランダムに一時停止し、呼び出しスタックを確認します。それがトランクに戻るラインです。その上の各呼び出しサイト(機能ではなく、呼び出しサイト)は分岐点です。その呼び出しサイトがサンプルの一部(40%など)にある場合、それは、プルーニングすることでおおよそどれだけ節約できるかです。

したがって、関数にかかる時間を測定するものとは考えないでください。どのコールサイトが「重い」かを尋ねるようなものだと考えてください。これですべてです。

于 2010-04-30T01:40:48.433 に答える