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時間は必須ではありませんが(測定したいのですが)、経過時間については、複雑なコマンドやモジュールを使用するのではなく、このようなことをしたいと思います。
経過時間を秒単位で取得するには、 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()
が使用されます。これは、すべてのプラットフォームでより高い解像度を持つタイミング関数を選択するためです。
実行時間を取得するなど、既存の関数に対して追加の作業を行うために、常にデコレータを使用しています。 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()
私はこの問題を何度も解決していることに気付いたので、最終的に 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%)
これは、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)
シンプルにするために今私が大好きなもう1つのオプションがあります-ipython
。 ipythonでは、多くの便利な機能に加えて次のことができます。
%time <expression>
-式でまっすぐなCPU時間とウォール時間を取得します
%timeit <expression>
-式のループでCPU時間とウォール時間を取得します