粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Python Computation Time Mesurement Class(Pythonでプログラムの実行時間を測る方法)

Computation time measuring is important issue for most programmers.
Pythonで実行時間を測って可視化したい時があるかと思います。

Basis (原理)

Many functions exist for the time measurement.
以下に詳しくありますがtimeをimportすればOKです。
16.3. time — 時刻データへのアクセスと変換 — Python 3.6.3rc1 ドキュメント

I use time.time() to get current time.
There are some alternative such as time.clock() or something.

そのうち、time.time()で現在の時間を浮動小数点で得ることができるため、

start=time.time()
# ここでなにかする
end=time.time()
dt=end-start # かかった時間

となります。

My class (作成したクラス)

いちいち宣言したり、過去の値を保存するのは管理が面倒で馬鹿らしいため、クラスとして実装しました。

import numpy as np
import matplotlib.pyplot as plt
import time # time.time() to get time

class Checktime:
    def __init__(self):
        self.checktime = [0]
        self.difftime = []
        self.start = time.time()
    def check(self,name=""):
        self.checktime.append(time.time()-self.start)
        self.difftime.append(self.checktime[-1]-self.checktime[-2])
        print(name)
        print("Now time is "+str(self.checktime[-1])+" [s]")
        print("Computed in "+str(self.difftime[-1])+" [s]\n")
        
    def show(self):
        leng = len(self.checktime)
        plt.plot(np.arange(0,leng,1),np.array(self.checktime),label="Accumulation time")
        plt.plot(np.arange(1,leng,1),np.array(self.difftime),label="Each Process time")
        plt.legend()
        plt.grid()
        plt.show()

How to Use

使い方は簡単。

import

Just put this function on you source or save this program as "FILENAME.py" and write as follows.

from FILENAME import *

上のソースコードをまるっとコピーして自分のソースに貼るか、適当な名前で保存して上のようにImportできます。

Usage

プロセス名を入れることでどのプロセスにどれだけ時間がかかったかを可視化できます。

# init 
T = Checktime()

# do something
T.check() # print current time

# or you can name your processing
T.check("PROCESS NAME")

# Finally you can see the time consumption graph
T.show()


以下のような出力を得るでしょう。
results is like this:
Console output

Image Reading
Now time is 0.00387120246887 [s]
Differ from 0.00387120246887 [s]

Get Histogram
Now time is 0.00810813903809 [s]
Differ from 0.00423693656921 [s]

Get Mask
Now time is 0.00903105735779 [s]
Differ from 0.000922918319702 [s]

Extract ORB Feature
Now time is 0.0206370353699 [s]
Differ from 0.0116059780121 [s]

出て来る図はこんな感じ。

Figure output
f:id:ossyaritoori:20171005075324p:plain

pyplotlibに関する覚書

python初心者にありがたいわかりやすい日本語記事がこちら。
bicycle1885.hatenablog.com