"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

pythonプログラムの実行時間を計測する汎用的なユーティリティ(Timer)を作っておく

ありふれたテーマですけど、プログラムの実行時間計測をやってみます。 

f:id:arakan_no_boku:20180824234031j:plain

時間を計測するだけなら、ごく簡単です。 

これだけでも、経過時間は計算できます。

import time

start = time.time()

・・・・何かの処理・・・

stop =time.time()

result = stop -start

 

でも、そこら中にこんなコードを埋め込むのは面倒なので、ちょっとしたユーティリティを作ろうかなと。 

 

合計時間とラップタイムがとれる仕様にします

 

使い方はこんな感じにします。 

最初に、Timer() オブジェクトを作って、start()。 

あとは、ラップタイムをとりたいタイミングで、get_string_lap()。 

合計タイムをとりたいタイミングで、stop() → get_string()。 

呼び出す都度、「00時間02分08秒17ミリ秒」という文字列を表示するようにします。 

ラップタイムは呼び出し都度、前回の時間からの経過時間にします。 

こうしておくと、深層学習の学習時に1エポック毎の経過時間を表示したり、色々と応用できますから。

 

実装したソースです

 

timer.py という名前にしてます。 

ソース全文です。

import time
from datetime import datetime
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() のところで、ラップごとの開始時間を差し替えている部分くらいです。

 

動作確認と結果です

 

早速動作確認のかんたんなプログラムを作って試してみます。 

utilsというフォルダを作って、その下に timer.py を置きました。 

utilsフォルダに「__init__.py」(空のpyプログラム)をおいて、importできるようにしてます。  

なので、import utils.timer as tmr としてますが、この辺はファイルの配置場所によって変わります。

 

import utils.timer as tmr
import time

# Timerオブジェクトを生成
timer = tmr.Timer()
# 計測開始 timer.start() for i in range(11): time.sleep(1.13)
# ラップタイプを表示する print("ラップ" + str(i).zfill(2) + "=" + timer.get_string_lap()) # 計測を終了して、合計時間を表示する
timer.stop() print("合計時間=" + timer.get_string())

 

単純に1.13秒ずつスリープしてラップタイムを表示しつつ、最後に合計を表示するだけのプログラムです。 

出力結果です。

ラップ00=00時間00分01秒12ミリ秒
ラップ01=00時間00分01秒20ミリ秒
ラップ02=00時間00分01秒17ミリ秒
ラップ03=00時間00分01秒17ミリ秒
ラップ04=00時間00分01秒14ミリ秒
ラップ05=00時間00分01秒15ミリ秒
ラップ06=00時間00分01秒17ミリ秒
ラップ07=00時間00分01秒14ミリ秒
ラップ08=00時間00分01秒17ミリ秒
ラップ09=00時間00分01秒15ミリ秒
ラップ10=00時間00分01秒17ミリ秒
経過時間=00時間00分12秒88ミリ秒

 

まあ、こんなもんですかね。