1

これら 2 つのコード フラグメントの速度に大きな違いはありますか?

1.

x = set( i for i in data )

対:

2.

x = set( [ i for i in data ] )

;set()の代わりに推奨している人々を見てきました。set([])これは単にスタイルの問題ですか?

4

2 に答える 2

6

フォーム

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 がこれを最適化する方法がわかりません。

于 2013-01-28T19:51:14.490 に答える
3

この[]構文はリストを作成しますが、セットが作成されるとすぐに破棄されます。したがって、プログラムのメモリフットプリントを増やしています。

ジェネレーター構文はそれを回避します。

于 2013-01-28T19:51:49.133 に答える