見出し画像

【Python】実行時間を計測・比較する関数を書いたぞい


Pythonやってると、

やりたいことに対して複数の処理の仕方がある場合が出てくるんですよ。


例えば、

[0,1,2,3,4,5]

入力

こういうリストがあるとします。


このリストの各要素に1を足した

[1,2,3,4,5,6]

出力

こんなリストが欲しい場合。


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])

コレで実行!!


('_com', {'average': 4.00543212890625e-07, 'min': 0.0, 'max': 1.1920928955078125e-06, 'result': [1, 2, 3, 4, 5, 6]})
('_map', {'average': 6.914138793945312e-07, 'min': 0.0, 'max': 2.86102294921875e-06, 'result': [1, 2, 3, 4, 5, 6]})
attem 100

ほええ、内包表記の方が速いんだ。


…いやいや、

100回程度じゃ分からないぜ!


なんて時は↓こう↓attemに任意の数字を入力すれば…

time_comparison(_map,_com,arg=[0,1,2,3,4,5],attem=10000)


一万回実行した結果がこちら。

('_com', {'average': 3.836393356323242e-07, 'min': 0.0, 'max': 2.3126602172851562e-05, 'result': [1, 2, 3, 4, 5, 6]})
('_map', {'average': 6.704568862915039e-07, 'min': 0.0, 'max': 6.198883056640625e-06, 'result': [1, 2, 3, 4, 5, 6]})
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つ以上の関数も同時に比較できます。


('_com', {'average': 4.4107437133789065e-07, 'min': 0.0, 'max': 1.1920928955078125e-06, 'result': [1, 2, 3, 4, 5, 6]})
('_for', {'average': 4.6253204345703124e-07, 'min': 0.0, 'max': 1.1920928955078125e-06, 'result': [1, 2, 3, 4, 5, 6]})
('_map', {'average': 6.914138793945312e-07, 'min': 0.0, 'max': 3.0994415283203125e-06, 'result': [1, 2, 3, 4, 5, 6]})
attem 100


標準ライブラリしか使わないからコピペするだけで使えます。

試してみてね。

この記事が気に入ったらサポートをしてみませんか?