1

この投稿で説明されているzipmapのいくつかのオプションのパフォーマンスについて疑問に思いまし

(私はまだここでは新しいので、そのスレッドについてコメントすることはできませんでした)。

特に、リスト内包表記を比較することに興味があります。

[f(x) for f,x in zip(functions, values)]

マップコールへ:

map(lambda f,x: f(x), functions, values)

ラムダは高価だと聞きましたが、マップに含まれる関数呼び出しは少なくなりませんか?

ありがとう!

4

1 に答える 1

3

まず第一に、パフォーマンスよりも読みやすさです。これがプログラムのボトルネックであることが証明できない限り、はるかに読みやすいリスト内包表記を使用してください。

ボトルネックの場合、いくつかのパフォーマンステストを実行します(モジュールを参照)。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

とにかく、リスト内包表記がパフォーマンスに勝っていることがわかります。

于 2012-05-25T21:49:44.080 に答える