jsとpython3のmapとfilter、包括表記が何で速いかみたいな話
Author: 水卜
Author: 水卜
mapは配列の数を変えずに内容を書き換える。
filterは配列の内容を変えずに数を変える。
これらを使うと単純にforEachするよりも読み手に目的が伝わりやすい。
JavaScriptでは以下のような感じで使う。
const mappedArray = array.map(item => item.name);
const filteredArray = array.filter(item => item.name === 'target');
pythonにも一応あります。
items = [{'name':'target'}, {'name':'nontarget'}, {'name':'target'}]
mapped_array = map(lambda item:item['name'], items)
filtered_array = filter(lambda item:item['name'] == 'target', items)
そもそもpythonは包括表記があるのでほとんどの場合はこれでいいよね
mapped_array = [item['name'] for item in items]
filtered_array = [item for item in array if item['name']=='target']
if elseをつけて配列ループしたいときは以下。
['find' if item['name']=='target' else 'no' for item in items]
def loop(n):
result = []
for i in range(n):
result.append(i)
return result
これを逆アセンブルすると、ループの中で毎回resultオブジェクトのappend属性を参照している。
属性の参照は重い。
def loop(n):
result = []
append = result.append
for i in range(n):
append(i)
return result
このように、appendをループの外に追い出すだけでかなり速くなる。
包括表記はこれをもう一段階速くしたもの。
詳細は省くが、appendをロードして呼ぶことを省き、LIST_APPENDというリスト専用の処理を呼んでいる。
だから速い。