リストの全要素へ同じ処理を適用する時に,lambda関数化してmapで適用するのと,内包表記で適用後の値を要素とするリストを生成するのはどっちが早いんだろう?
こんなタイマーを作って,試してみた.
# -*- coding: utf-8 -*- import timeit import sys '''実行速度を計測する''' def time_measurement(script, preprocessing, number, recursion): '''script is main process, preprocessing includes import statements, number means the number of a single trial, recursion means the number of trials''' timer = timeit.Timer(script, preprocessing) result = timer.repeat(recursion, number) return result
試してみる.
# -*- coding: utf-8 -*- import tm # 内包表記 script = ''' o=[' '.join(d) for d in data] ''' preproc = ''' import numpy;data = [('%d'%(100*numpy.random.uniform()),'%d'%(100*numpy.random.uniform())) for i in range(1000000)] ''' result=tm.time_measurement(script,preproc,10,2) print 'make list:',min(result) # for文 script = ''' o=[] for d in data: o.append(' '.join(d)) ''' result=tm.time_measurement(script,preproc,10,2) print 'for:',min(result) # map関数 script = ''' o=map(joint,data) ''' preproc = ''' import numpy;data = [('%d'%(100*numpy.random.uniform()),'%d'%(100*numpy.random.uniform())) for i in range(1000000)];joint=lambda x:' '.join(x) ''' result=tm.time_measurement(script,preproc,10,2) print 'use map:',min(result)
結果
$ python test.py make list: 1.00997805595 for: 1.52903008461 use map: 1.53125476837
内包表記の勝ち
for文とmap関数は,ほぼ同じ時間だった.同じように実装されているのかなぁ.