web-dev-qa-db-ja.com

Python 2.7のコードブロックの実行時間を取得する

Pythonプログラムのコードブロックを評価するために経過時間を測定したいのですが、ユーザーCPU時間、システムCPU時間、経過時間を分離する可能性があります。

timeitモジュールは知っていますが、多くの自己記述関数があり、セットアッププロセスでそれらを渡すのは非常に簡単ではありません。

私はむしろ次のように使用できるものが欲しいです:

#up to here I have done something....
start_counting() #or whatever command used to mark that I want to measure
                   #the time elapsed in the next rows
# code I want to evaluate
user,system,elapsed = stop_counting() #or whatever command says:
                                      #stop the timer and return the times

ユーザーとシステムのCPU時間は必須ではありませんが(測定したいのですが)、経過時間については、複雑なコマンドやモジュールを使用するのではなく、このようなことをしたいと思います。

65
lucacerone

経過時間を秒単位で取得するには、 timeit.default_timer() を使用できます。

import timeit
start_time = timeit.default_timer()
# code you want to evaluate
elapsed = timeit.default_timer() - start_time

timeit.default_timer()またはtime.time()の代わりにtime.clock()が使用されます。これは、すべてのプラットフォームでより高い解像度を持つタイミング関数を選択するためです。

140
Andrew Clark

実行時間を取得するなど、既存の関数に対して追加の作業を行うために、常にデコレータを使用しています。 Pythonicでシンプルです。

import time

def time_usage(func):
    def wrapper(*args, **kwargs):
        beg_ts = time.time()
        retval = func(*args, **kwargs)
        end_ts = time.time()
        print("elapsed time: %f" % (end_ts - beg_ts))
        return retval
    return wrapper

@time_usage
def test():
    for i in xrange(0, 10000):
        pass

if __== "__main__":
    test()
23
Yarkee

私はこの問題を何度も解決していることに気付いたので、最終的に library を作成しました。 pip install timer_cmでインストールします。次に:

from time import sleep
from timer_cm import Timer

with Timer('Long task') as timer:
    with timer.child('First step'):
        sleep(1)
    for _ in range(5):
        with timer.child('Baby steps'):
            sleep(.5)

出力:

Long task: 3.520s
  Baby steps: 2.518s (71%)
  First step: 1.001s (28%)
10

これは、Context Managerを使用して実現できます。たとえば、次のとおりです。

from contextlib import contextmanager
import time
import logging
@contextmanager
def _log_time_usage(prefix=""):
    '''log the time usage in a code block
    prefix: the prefix text to show
    '''
    start = time.time()
    try:
        yield
    finally:
        end = time.time()
        elapsed_seconds = float("%.2f" % (end - start))
        logging.debug('%s: elapsed seconds: %s', prefix, elapsed_seconds)

使用例:

with _log_time_usage("sleep 1: "):
    time.sleep(1)
8
monklof

シンプルにするために今私が大好きなもう1つのオプションがあります-ipython。 ipythonでは、多くの便利な機能に加えて次のことができます。

%time <expression>-式でまっすぐなCPU時間とウォール時間を取得します

%timeit <expression>-式のループでCPU時間とウォール時間を取得します

1
valex