まず第一に、パフォーマンスよりも読みやすさです。これがプログラムのボトルネックであることが証明できない限り、はるかに読みやすいリスト内包表記を使用してください。
ボトルネックの場合は、いくつかのパフォーマンステストを実行します(モジュールを参照)。timeit
ただし、すべての機能が簡単でない限り、どちらの方法でもそれほど重要ではありません。
簡単なテストを行う:
python -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "[f(x) for f,x in zip(functions, values)]"
1000 loops, best of 3: 207 usec per loop
python -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "list(map(lambda f,x: f(x), functions, values))"
1000 loops, best of 3: 315 usec per loop
そして、ジェネレータ式が必要な場合:
python -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "list(f(x) for f,x in zip(functions, values))"
1000 loops, best of 3: 250 usec per loop
そして、完全を期すためにすぐにリストを生成するPython 2.xの古いスタイルのマップを使用します(リスト内包表記の例と同等)。
python2 -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "map(lambda f,x: f(x), functions, values)"
1000 loops, best of 3: 234 usec per loop
とにかく、リスト内包表記がパフォーマンスに勝っていることがわかります。