1

現在、私はこれを行っています:

# duplicates is a list
uniques = list(set(duplicates))

ただし、一意性は一時的なものであることがよくあります。ユニークのジェネレーターを構築する方が良いでしょうか?もしそうなら、私はこれをどのように行いますか?

4

3 に答える 3

5

リストが必要ない場合は、set(duplicates)代わりに使用してください。これにより、メモリ使用量が約半分になります。セットは反復可能です。

または、ジェネレーターを定義できます。

def uniques(it):
    seen = set()
    for x in it:
        if x not in seen:
            yield x
            seen.add(x)

しかし、私の推測では、これは一度にセットを構築するよりもはるかに遅くなります。いずれにせよ、メモリ消費量はほぼ同じです。

于 2012-04-27T13:11:15.847 に答える
2

ジェネレーターを使用して達成したいことは、私には完全には明確ではありません。

1 つのことは明らかです: 現在の要素が一意であるかどうかを確立するために、ジェネレータは以前に見られたすべての一意の要素を知る必要があるため、メモリ要件は低下しません。

また、リストを構築する目的はlist(set(...))完全には明確ではありません。すでに構築しているセットに固執しないのはなぜですか?

于 2012-04-27T13:09:36.753 に答える
1

静的コレクションの代わりにジェネレーターを使用すると、2 つの利点が考えられます。そのうちの 1 つだけが (おそらく) ここで適用されます。

  • メモリ使用量。一意のものを生成するには、この方法または他の方法で O(n) メモリが必要なため、ここでは適用されません

  • 時間 - 生成された出力の一部のみを消費することが予想される場合は、遅延生成することで時間を節約できます。したがって、これがあなたのケースである場合、ジェネレーターを使用すると、処理能力がいくらか節約される可能性があります。もちろん、遅延して一意の値を生成するには、既に生成された値のセット (上記を参照) を記憶し、それらをフィルターで除外する必要があります。

于 2012-04-27T13:12:36.893 に答える