Concurrency-in-python-benchmarking-and-profiling
ベンチマークとプロファイリング
この章では、ベンチマークとプロファイリングがパフォーマンスの問題にどのように役立つかを学習します。
コードを作成して、目的の結果が得られたとしても、ニーズが変わったためにこのコードを少し速く実行したい場合はどうでしょうか。 この場合、コードのどの部分がプログラム全体を遅くしているのかを知る必要があります。 この場合、ベンチマークとプロファイリングが役立ちます。
ベンチマークとは何ですか?
ベンチマークの目的は、標準と比較して何かを評価することです。 ただし、ここで生じる問題は、ベンチマークとなるものと、ソフトウェアプログラミングの場合にベンチマークが必要な理由です。 コードのベンチマークとは、コードの実行速度とボトルネックの場所を意味します。 ベンチマークの主な理由の1つは、コードを最適化することです。
ベンチマークはどのように機能しますか?
ベンチマークの仕組みについて話す場合、プログラム全体を1つの現在の状態としてベンチマークすることから始めてから、マイクロベンチマークを組み合わせて、プログラムをより小さなプログラムに分解することができます。 プログラム内のボトルネックを見つけて最適化するため。 言い換えれば、大きくて難しい問題を、それらを最適化するための一連の小さくて少し簡単な問題に分割することとして理解できます。
ベンチマーク用のPythonモジュール
Pythonには、 timeit と呼ばれるベンチマーク用のデフォルトモジュールがあります。 timeit モジュールの助けを借りて、メインプログラム内の小さなPythonコードのパフォーマンスを測定できます。
例
次のPythonスクリプトでは、 timeit モジュールをインポートしています。このモジュールは、2つの関数( functionA および functionB )の実行にかかる時間をさらに測定します-
上記のスクリプトを実行した後、次のように両方の関数の実行時間を取得します。
出力
デコレータ関数を使用して独自のタイマーを作成する
Pythonでは、 timeit モジュールのように動作する独自のタイマーを作成できます。 decorator 関数を使用して実行できます。 以下は、カスタムタイマーの例です-
上記のPythonスクリプトは、ランダム時間モジュールのインポートに役立ちます。 timer_func()デコレータ関数を作成しました。 これには、その中にfunction_timer()関数があります。 これで、ネストされた関数は、渡された関数を呼び出す前に時間を取得します。 次に、関数が戻るまで待機し、終了時間を取得します。 このようにして、最終的にpythonスクリプトに実行時間を出力させることができます。 スクリプトは、次のように出力を生成します。
出力
プロファイリングとは
プログラマーは、メモリの使用、時間の複雑さ、またはプログラムに関する特定の命令の使用などの属性を測定して、そのプログラムの実際の能力を測定したいことがあります。 このようなプログラムに関する測定は、プロファイリングと呼ばれます。 プロファイリングでは、動的プログラム分析を使用してこのような測定を行います。
後続のセクションでは、プロファイリング用のさまざまなPythonモジュールについて学習します。
cProfile –組み込みモジュール
例
上記のコードは thread_increment.py ファイルに保存されます。 今、次のようにコマンドラインでcProfileでコードを実行します-
上記の出力から、cProfileは呼び出されたすべての3577関数を、それぞれに費やした時間と呼び出された回数とともに出力することが明らかです。 以下は、出力で得られた列です-
- ncalls -これは行われた呼び出しの数です。
- tottime -指定された関数で費やされた合計時間です。
- percall -tottimeをncallsで割った商を指します。
- cumtime -これは、このサブ機能およびすべてのサブ機能で費やされた累積時間です。 再帰関数に対しても正確です。
- percall -cumtimeをプリミティブコールで割った商です。
- * filename:lineno(function)*-基本的に各関数のそれぞれのデータを提供します。