目次
プログラムの実行時間を計測するユーティリティクラスを作る
Pythonで時間を計測するだけなら、ごく簡単です。
これだけで経過時間は計算できます。
import time
start = time.time()
・・・・何かの処理・・・
stop =time.time()
result = stop -start
でも、そこら中にこんなコードを埋め込むのは面倒です。
そこで勉強を兼ねて、ちょっとしたユーティリティを作ります。
ユーティリティクラスの仕様
使い方はこんな感じにします。
- 最初に、Timer() オブジェクトを作って、start()。
- あとは、ラップタイムをとりたいタイミングで、get_string_lap()。
- 合計タイムをとりたいタイミングで、stop() → get_string()。
- 呼び出す都度、「00時間02分08秒17ミリ秒」という文字列を表示する
ラップタイムは呼び出し都度、前回の時間からの経過時間にします。
実装したソースです
class_timer.py という名前にします。
ソース全文です。
import time import math class Timer: start_time = 0 end_time = 0 result_time = 0 lap_st = 0 def start(self): self.start_time = time.time() self.lap_st = self.start_time def stop(self): self.end_time = time.time() self.result_time = round(self.end_time - self.start_time, 2) def get_string(self): return self.make_string(self.result_time) def get_string_lap(self): lap = time.time() st = self.lap_st self.lap_st = lap return self.make_string(round(lap - st, 2)) def get(self): return self.result_time def make_string(self, result_time): ms, hms = math.modf(result_time) hour = math.floor(hms / 3600) mint = math.floor((hms % 3600) / 60) secd = math.floor(hms % 60) msec = math.floor(ms * 100) return str(hour).zfill(2) + "時間" + str(mint).zfill(2) + "分" + \ str(secd).zfill(2) + "秒" + str(msec).zfill(2) + "ミリ秒"
特に難しいことはありません。
ちょっと工夫したのは、get_string_lap() のところで、ラップごとの開始時間を差し替えている部分くらいです。
動作確認と結果です
動作確認のかんたんなプログラムを作って試してみます。
class_timerは、同じフォルダにおいてる想定です。
from class_timer import Timer # Timerオブジェクトを生成 timer = Timer() # 計測開始 timer.start() for i in range(11): # 時間を浪費するだけのために、100万回ループする for j in range(1000000): pass # ラップタイプを表示する print("ラップ" + str(i).zfill(2) + "=" + timer.get_string_lap()) # 計測を終了して、合計時間を表示する timer.stop() print("合計時間=" + timer.get_string())
単純に100万回なにもしないループを回してラップタイムを表示して、最後に合計を表示するだけのプログラムです。
出力結果です。
ラップ01=00時間00分00秒06ミリ秒
ラップ02=00時間00分00秒05ミリ秒
ラップ03=00時間00分00秒05ミリ秒
ラップ04=00時間00分00秒05ミリ秒
ラップ05=00時間00分00秒05ミリ秒
ラップ06=00時間00分00秒05ミリ秒
ラップ07=00時間00分00秒05ミリ秒
ラップ08=00時間00分00秒05ミリ秒
ラップ09=00時間00分00秒06ミリ秒
ラップ10=00時間00分00秒06ミリ秒
合計時間=00時間00分00秒57ミリ秒
100万回ループまわしても、6ミリ秒しかかかってないので、いまいちなサンプルですけど、時間はちゃんと計測できて、かつ、合計もできてます。
まあ、こんなもんですかね。