mapと内包表記

[`evernote` not found]
Bookmark this on Hatena Bookmark
Share on Facebook
LINEで送る

リストの全要素へ同じ処理を適用する時に,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関数は,ほぼ同じ時間だった.同じように実装されているのかなぁ.