jsとpython3のmapとfilter、包括表記が何で速いかみたいな話
 Author: 水卜

map, filter

mapは配列の数を変えずに内容を書き換える。

filterは配列の内容を変えずに数を変える。

これらを使うと単純にforEachするよりも読み手に目的が伝わりやすい。

JavaScript

JavaScriptでは以下のような感じで使う。

const mappedArray = array.map(item => item.name);
const filteredArray = array.filter(item => item.name === 'target');

Python

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]

なんでPythonの包括表記は速いのか

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というリスト専用の処理を呼んでいる。

だから速い。

参考

Pythonの内包表記はなぜ速い? - DSAS開発者の部屋