【Python】実行時間を計測・比較する関数を書いたぞい
Pythonやってると、
やりたいことに対して複数の処理の仕方がある場合が出てくるんですよ。
例えば、
こういうリストがあるとします。
このリストの各要素に1を足した、
こんなリストが欲しい場合。
map(lambda x:x+1,[0,1,2,3,4,5])
[i+1 for i in [0,1,2,3,4,5]]
map関数とリスト内包表記を利用した2通りのやり方が使えます。
でもこの2つ、パッと見ではどっちを採用したらいいか判断しにくい。
そんな時にコレ!!!!
time_comparison
import time
def time_comparison(*f,arg=None,attem=100,Nonresult=False):
_dict={}
for _f in f:
_list=[]
for i in range(attem):
s=time.time()
_f(arg)
e=time.time()
_list.append(e-s)
_dict[_f.__name__]={"average":sum(_list)/attem,"min":min(_list),"max":max(_list),"result":_f(arg)}
if Nonresult:
for _k,_v in _dict.items():
del _v["result"]
for it in sorted(_dict.items(),key=lambda x:x[1].get("average")):
print(it)
print("attem "+str(attem))
複数の関数を引数として渡すと、
attemに設定された試行回数(デフォルトでは100)の分だけ処理を実行し、
それぞれの平均・最長・最短の実行時間を算出。
平均実行時間が短い順に表示してくれます。
先ほどの2通りの処理を、
def _map(a):
_b=map(lambda x:x+1,a)
return [_bi for _bi in _b]
def _com(a):
_c=[i+1 for i in a]
return _c
以上のように関数化して…
time_comparison(_map,_com,arg=[0,1,2,3,4,5])
コレで実行!!
ほええ、内包表記の方が速いんだ。
…いやいや、
100回程度じゃ分からないぜ!
なんて時は↓こう↓、attemに任意の数字を入力すれば…
time_comparison(_map,_com,arg=[0,1,2,3,4,5],attem=10000)
一万回実行した結果がこちら。
やっぱ内包表記の方が速いんだ。
ちなみに受け取る関数は可変長になっているので、
こんな関数を追加して…
def _for(a):
l=[]
for i in a:
l.append(i+1)
return l
time_comparison(_map,_com,_for,arg=[0,1,2,3,4,5])
3つ以上の関数も同時に比較できます。
標準ライブラリしか使わないからコピペするだけで使えます。
試してみてね。
この記事が気に入ったらサポートをしてみませんか?