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

我并不完全清楚您希望通过使用生成器来实现什么。

有一点很清楚:它不会降低内存需求,因为为了确定当前元素是否唯一,生成器需要知道所有先前看到的唯一元素。

此外,构建列表的目的list(set(...))并不完全清楚。为什么不坚持使用您已经在构建的系列?

于 2012-04-27T13:09:36.753 回答
1

使用生成器而不是静态集合有两个可能的好处,其中只有一个(可能)适用于这里:

  • 内存使用情况。不适用于此处,因为要以这种方式或其他方式生成唯一性,您需要 O(n) 内存

  • 时间 - 如果您希望只消耗生成的输出的一部分,那么您可以通过懒惰地生成它来节省时间。因此,如果这是您的情况,那么使用生成器可能会为您节省一些处理能力。当然,要懒惰地生成唯一值,您需要记住已经生成的一组值(见上文)并随时过滤掉它们。

于 2012-04-27T13:12:36.893 回答