現在、私はこれを行っています:
# duplicates is a list
uniques = list(set(duplicates))
ただし、一意性は一時的なものであることがよくあります。ユニークのジェネレーターを構築する方が良いでしょうか?もしそうなら、私はこれをどのように行いますか?
現在、私はこれを行っています:
# duplicates is a list
uniques = list(set(duplicates))
ただし、一意性は一時的なものであることがよくあります。ユニークのジェネレーターを構築する方が良いでしょうか?もしそうなら、私はこれをどのように行いますか?
リストが必要ない場合は、set(duplicates)
代わりに使用してください。これにより、メモリ使用量が約半分になります。セットは反復可能です。
または、ジェネレーターを定義できます。
def uniques(it):
seen = set()
for x in it:
if x not in seen:
yield x
seen.add(x)
しかし、私の推測では、これは一度にセットを構築するよりもはるかに遅くなります。いずれにせよ、メモリ消費量はほぼ同じです。
ジェネレーターを使用して達成したいことは、私には完全には明確ではありません。
1 つのことは明らかです: 現在の要素が一意であるかどうかを確立するために、ジェネレータは以前に見られたすべての一意の要素を知る必要があるため、メモリ要件は低下しません。
また、リストを構築する目的はlist(set(...))
完全には明確ではありません。すでに構築しているセットに固執しないのはなぜですか?
静的コレクションの代わりにジェネレーターを使用すると、2 つの利点が考えられます。そのうちの 1 つだけが (おそらく) ここで適用されます。
メモリ使用量。一意のものを生成するには、この方法または他の方法で O(n) メモリが必要なため、ここでは適用されません
時間 - 生成された出力の一部のみを消費することが予想される場合は、遅延生成することで時間を節約できます。したがって、これがあなたのケースである場合、ジェネレーターを使用すると、処理能力がいくらか節約される可能性があります。もちろん、遅延して一意の値を生成するには、既に生成された値のセット (上記を参照) を記憶し、それらをフィルターで除外する必要があります。