"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

Pythonでプログラムの実行時間を計測するユーティリティクラスを作る

f:id:arakan_no_boku:20180824234031j:plain

目次

Pythonで時間を計測する

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

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

import time

start = time.time()

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

stop =time.time()

result = stop -start

でも、そこら中にこんなコードを埋め込むのは面倒です。

そこで勉強を兼ねて、ちょっとしたユーティリティを作ります。 

ユーティリティクラスの仕様

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

  1. 最初に、Timer() オブジェクトを作って、start()。 
  2. あとは、ラップタイムをとりたいタイミングで、get_string_lap()。 
  3. 合計タイムをとりたいタイミングで、stop() → get_string()。 
  4. 呼び出す都度、「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ミリ秒しかかかってないので、いまいちなサンプルですけど、時間はちゃんと計測できて、かつ、合計もできてます。

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