これら 2 つのコード フラグメントの速度に大きな違いはありますか?
1.
x = set( i for i in data )
対:
2.
x = set( [ i for i in data ] )
;set()
の代わりに推奨している人々を見てきました。set([])
これは単にスタイルの問題ですか?
これら 2 つのコード フラグメントの速度に大きな違いはありますか?
1.
x = set( i for i in data )
対:
2.
x = set( [ i for i in data ] )
;set()
の代わりに推奨している人々を見てきました。set([])
これは単にスタイルの問題ですか?
フォーム
x = set(i for i in data)
は次の省略形です。
x = set((i for i in data))
これにより、遅延評価されるジェネレータ式が作成されます。に比べ:
x = set([i for i in data])
に渡す前にリスト全体を作成しますset
パフォーマンスの観点から、ジェネレーター式は特定の関数での短絡を可能にし (all
思い付くany
)、余分なリストを保存する必要がないため、メモリの消費量が少なくて済みます。場合によっては、これが非常に重要になることがあります。
実際に iterable 全体を反復処理する予定data
で、メモリが問題にならない場合、通常、リスト内包表記は同等のジェネレーター式よりもわずかに高速であることがわかりました*。
temp $ python -m timeit 'set(i for i in "xyzzfoobarbaz")'
100000 loops, best of 3: 3.55 usec per loop
temp $ python -m timeit 'set([i for i in "xyzzfoobarbaz"])'
100000 loops, best of 3: 3.42 usec per loop
速度に興味がある場合は、おそらく最速の賭けは次のとおりです。
x = set(data)
証拠:
temp $ python -m timeit 'set("xyzzfoobarbaz")'
1000000 loops, best of 3: 1.83 usec per loop
*Cpython のみ -- Jython や pypy がこれを最適化する方法がわかりません。
この[]
構文はリストを作成しますが、セットが作成されるとすぐに破棄されます。したがって、プログラムのメモリフットプリントを増やしています。
ジェネレーター構文はそれを回避します。