目前我正在这样做:
# 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)
但我的预感是,这将比一次性构建一套要慢得多。无论如何,内存消耗大致相同。
我并不完全清楚您希望通过使用生成器来实现什么。
有一点很清楚:它不会降低内存需求,因为为了确定当前元素是否唯一,生成器需要知道所有先前看到的唯一元素。
此外,构建列表的目的list(set(...))
并不完全清楚。为什么不坚持使用您已经在构建的系列?
使用生成器而不是静态集合有两个可能的好处,其中只有一个(可能)适用于这里:
内存使用情况。不适用于此处,因为要以这种方式或其他方式生成唯一性,您需要 O(n) 内存
时间 - 如果您希望只消耗生成的输出的一部分,那么您可以通过懒惰地生成它来节省时间。因此,如果这是您的情况,那么使用生成器可能会为您节省一些处理能力。当然,要懒惰地生成唯一值,您需要记住已经生成的一组值(见上文)并随时过滤掉它们。