Python 构造一个从集合返回唯一值的生成器是否可能且可取

Python 构造一个从集合返回唯一值的生成器是否可能且可取,python,generator,python-2.7,Python,Generator,Python 2.7,目前我正在这样做: # duplicates is a list uniques = list(set(duplicates)) 然而,uniques通常是暂时的。为Unique构建一个生成器是否更好?如果是这样的话,我该怎么做呢?我并不完全清楚您希望通过使用发电机实现什么 有一点很清楚:它不会降低内存需求,因为为了确定当前元素是否唯一,生成器需要知道所有以前看到的唯一元素 此外,在list(set(…)中构造列表的目的并不完全清楚。为什么不继续使用您已经在构建的集合呢?我并不完全清楚您希望通

目前我正在这样做:

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

然而,uniques通常是暂时的。为Unique构建一个生成器是否更好?如果是这样的话,我该怎么做呢?

我并不完全清楚您希望通过使用发电机实现什么

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


此外,在
list(set(…)
中构造列表的目的并不完全清楚。为什么不继续使用您已经在构建的集合呢?

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

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


此外,在
list(set(…)
中构造列表的目的并不完全清楚。为什么不继续使用您正在构建的集合呢?

如果您不需要列表,只需使用
set(duplicates)
。这大概是你记忆使用量的一半。布景很好看

或者,您可以定义生成器:

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

但我的预感是,这将比一次性构建一个集合慢得多。在任何情况下,内存消耗量都差不多。

如果不需要列表,只需使用
set(duplicates)
。这大概是你记忆使用量的一半。布景很好看

或者,您可以定义生成器:

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

但我的预感是,这将比一次性构建一个集合慢得多。在任何情况下,内存消耗都差不多。

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

  • 内存使用。这里不适用,因为要生成unique,您需要这样或那样的O(n)内存

  • 时间-如果您希望只消耗生成的输出的一部分,那么您可以通过惰性地生成它来节省时间。所以如果你是这样的话,那么也许使用发电机可以节省一些处理能力。当然,要懒洋洋地生成unique,您需要记住已经生成的一组值(见上文),并在运行时过滤掉这些值


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

  • 内存使用。这里不适用,因为要生成unique,您需要这样或那样的O(n)内存

  • 时间-如果您希望只消耗生成的输出的一部分,那么您可以通过惰性地生成它来节省时间。所以如果你是这样的话,那么也许使用发电机可以节省一些处理能力。当然,要懒洋洋地生成unique,您需要记住已经生成的一组值(见上文),并在运行时过滤掉这些值