3

JSON シリアライゼーション時間をベンチマークし、thrift および Google のプロトコル バッファのシリアライゼーション時間と比較する必要があります。また、Python である必要があります。

Python プロファイラーを使用する予定でした。 http://docs.python.org/2/library/profile.html

プロファイラーは、関数のランタイムを見つけるための最良の方法でしょうか? または、関数呼び出しの前後にタイムスタンプを出力する方が良いでしょうか?

それとももっと良い方法がありますか?

4

2 に答える 2

5

profileリンク先のドキュメントから:

注意: プロファイラー モジュールは、ベンチマーク目的ではなく、特定のプログラムの実行プロファイルを提供するように設計されています (そのためtimeit、かなり正確な結果が得られます)。これは、C コードに対する Python コードのベンチマークに特に当てはまります。プロファイラーは Python コードのオーバーヘッドを導入しますが、C レベル関数のオーバーヘッドを導入しないため、C コードはどの Python コードよりも高速に見えます。

いいえ、profileコードのベンチマークに使用したくありません。profile使用したいのは、コードが遅すぎる理由を理解することです。

また、関数呼び出しの前後にタイムスタンプを出力したくない場合もあります。注意しないと、そのように間違ってしまう可能性があることがあまりにも多くあります (間違ったタイムスタンプ関数を使用したり、GC にテスト実行の途中でサイクル コレクションを実行させたり、ループ タイミングのテスト オーバーヘッドを含めたりするなど)。 .)、timeitそのすべてを処理します。

このようなものは、物事をベンチマークする一般的な方法です。

for impl in 'mycode', 'googlecode', 'thriftcode':
    t = timeit.timeit('serialize(data)', 
                      setup='''from {} import serialize; 
                               with open('data.txt') as f: data=f.read()
                            '''.format(impl),
                      number=10000)
    print('{}: {}'.format(impl, t)

(ここでは、3 つの異なるシリアライゼーション ツールを同じ API にラップする 3 つのモジュールを記述できると想定しています。単一のserialize関数は、文字列を受け取り、それを使用して何らかの処理を行います。明らかに、物事を整理する方法はさまざまです。)

于 2013-10-05T01:53:02.810 に答える
2

問題の開始時と終了時のタイム スタンプに基づいて Python コードをプロファイリングする場合は注意が必要です。これは、同時に実行されている可能性のある他のプロセスを考慮していません。

代わりに、以下を検討する必要があります。

Pythonスクリプトをベンチマークする簡単な方法はありますか?

于 2013-10-05T01:56:49.007 に答える