4

私はpythonに取り組んでおり、コードの統計と実行時間を見つけるという概念に出くわしました

次のコードがあるとします

from time import gmtime, strftime
import timeit


def calculation():
     a = 2
     b = 3
     res = a + b
     return  res

if 'name' == 'main' :
    exec_time = timeit.timeit(calculation)
    print exec_time

結果:

0.2561519145965576

上記のコードから、コードの実行時間を見つけることができますが、python でコードの統計を見つける方法は?

最後に、私の意図は以下のポイントです

  1. Pythonでコードの統計を見つける方法
  2. Pythonでコード全体の実行時間を見つける方法
  3. 実際にコードの統計を意味するのは何ですか?

編集されたコード:

たとえば、ファイルに上記のコードがありましたtest.py

今、私は以下のコマンドで上記のファイルを実行しました

python -m cProfile test.py

結果 :

sh-4.2$ python -m cProfile test.py
         4 function calls in 0.001 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.001    0.001 test.py:1(<module>)
        1    0.000    0.000    0.000    0.000 timeit.py:105(Timer)
        1    0.001    0.001    0.001    0.001 timeit.py:53(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

したがって、上記のコードを実行するときにこのようなものが必要です。端末からtest.pyコマンドを使用してファイルを実行するのではなく、ファイル内に統計を出力するこの機能を記述しようとしています。python -m cProfile test.py

calculation()実際には、関数の計算には何らかの操作を実行する大きな機能があるため、少なくともファイルの実行時に関数の統計と実行時間を見つけたいと思います。

4

2 に答える 2

2

あなたが求めているのは、 timeit モジュールのプログラムインターフェイスの方法です。それはここに文書化されています。最小値、最大値、平均値などの統計を計算するには、サンプル セットが必要です。これは、timeit モジュールに含まれる Timeit クラスの repeat メソッドを使用して、計算を何度も実行することを意味します。

例えば:

timer = timeit.Timer(calculation)
results = timer.timeit(10000)
于 2012-11-14T08:30:56.630 に答える
0

cProfileコード内からの使用方法を尋ねていると思います。実際には非常に簡単であることがわかります。 cProfile.Profileには文書化されていない と の 2 つのメソッドがenableありdisable、これらを使用してプロファイラーを開始および停止できます。これは、コンテキスト マネージャーまたはデコレーターを簡単に作成できることを意味します。次のレシピは、これらの両方を 1 つのオブジェクトに実装し、モジュールを使用して出力を処理および印刷する方法を含んでいpstatます。

import cProfile, pstats, functools

class profile:

    def __init__(self, filename=None):
        """
        If defined, output is written to *filename*, otherwise it
        is processed using *pstats* and printed to STDOUT.
        """
        self._filename = filename
        self._prof = cProfile.Profile()

    def __enter__(self):
        self._prof.enable()

    def __exit__(self, exc_type, exc_value, traceback):
        self._prof.disable()
        if self._filename is not None:
            self._prof.dump_stats(self._filename)
        else:
            stats = pstats.Stats(self._prof)
            self.print_stats(stats)

    def print_stats(self, stats):
        """
        This method processes the stats and prints them.
        """
        stats.strip_dirs().sort_stats('cumulative').print_stats(20)

    def __call__(self, func):
        self._func = func
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            with self:
                return func(*args, **kwargs)
        return wrapper

したがって、使用法は次のとおりです。

@profile()
def calculation():
    a = 2
    b = 3
    res = a + b
    return  res

calculation()

また

with profile('output_file.pstat'):
    calculation()

必要に応じて変更print_statsして、必要な出力を表示できます。

于 2012-11-14T09:42:11.373 に答える