1. ホーム
  2. python

[解決済み] Pythonスクリプトのベンチマークを行う簡単な方法はありますか?

2022-03-06 09:06:26

質問

通常、私はシェルコマンドを使用します。 time . 私の目的は、データが小、中、大、超大のセットで、どれくらいの時間とメモリ使用量になるかをテストすることです。

LinuxまたはPythonでこれを行うためのツールはありますか?

どのように解決するのですか?

をご覧ください。 時間 , Python プロファイラ そして パイカルグラフ . また、次のページもご覧ください。 のコメントです。 nikicc を言及する " スネークビズ "です。プロファイリングデータをまたひとつ視覚化することができ、参考になります。

時刻表示

def test():
    """Stupid test function"""
    lst = []
    for i in range(100):
        lst.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))

    # For Python>=3.5 one can also write:
    print(timeit.timeit("test()", globals=locals()))

基本的には、pythonのコードを文字列のパラメータとして渡すと、指定した回数で実行され、実行時間が表示されます。からの重要なビットは ドキュメント :

timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None) を作成します。 Timer のインスタンスを指定します。 設定 コードと タイマー 関数を実行し、その timeit メソッドを を実行します。オプションの グローバル 引数は、コードを実行する名前空間を指定します。

...そして

Timer.timeit(number=1000000) 時間 番号 mainステートメントの実行。 これは setup を実行します。 文の実行にかかる時間を返します。 ステートメントを何度も実行し、その回数を秒単位で float で表します。 引数はループの回数で、デフォルトは1回です。 百万円です。 メインステートメント、Setupステートメント、タイマ関数 がコンストラクタに渡されます。

注意 デフォルトでは timeit を一時的にオフにします。 garbage collection のタイミングになります。 この方法の利点は 独立したタイミングをより比較しやすくすることができます。 このデメリットは GCが性能の重要な要素である可能性があること。 関数が測定されます。 もしそうであれば、GCを再度有効にするのは、最初の ステートメントで 設定 の文字列を使用します。 例えば

timeit.Timer('for i in xrange(10): oct(i)', 'gc.enable()').timeit()

プロファイリング

プロファイリングを行うことで だいぶ をより詳細に把握することができます。以下は、"インスタント例"です。 公式ドキュメント :

import cProfile
import re
cProfile.run('re.compile("foo|bar")')

を与えることになる。

      197 function calls (192 primitive calls) in 0.002 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     1    0.000    0.000    0.001    0.001 <string>:1(<module>)
     1    0.000    0.000    0.001    0.001 re.py:212(compile)
     1    0.000    0.000    0.001    0.001 re.py:268(_compile)
     1    0.000    0.000    0.000    0.000 sre_compile.py:172(_compile_charset)
     1    0.000    0.000    0.000    0.000 sre_compile.py:201(_optimize_charset)
     4    0.000    0.000    0.000    0.000 sre_compile.py:25(_identityfunction)
   3/1    0.000    0.000    0.000    0.000 sre_compile.py:33(_compile)

この2つのモジュールは、ボトルネックを探すためのヒントを与えてくれるはずです。

また、出力された内容を把握するために profile をご覧ください。 この記事

パイカルグラフ

ノート pycallgraphは公式に放棄されました。 2018年2月以降 . 2020年12月時点ではまだPython 3.6で動作していましたが。PythonがプロファイリングAPIを公開する方法にコアな変更がない限り、それは有用なツールであり続けるはずですが。

本モジュール は、graphvizを使用して、以下のようなコールグラフを作成します。

どのパスが最も時間を使ったかを色で簡単に確認することができます。pycallgraph APIを使用して作成するか、パッケージ化されたスクリプトを使用することができます。

pycallgraph graphviz -- ./mypythonscript.py

しかし、そのオーバーヘッドは相当なものです。そのため、すでに長時間稼働しているプロセスでは、グラフの作成に時間がかかることがあります。