目前我正在这样做:
# duplicates is a list
uniques = list(set(duplicates))
然而,独角兽通常是短暂的。为uniques构建一个生成器会更好吗?如果是这样,我该怎么做?
答案 0 :(得分:2)
如果您不需要列表,请改用set(duplicates)
。这大约减少了你的记忆使用量。集合是可迭代的。
或者,您可以定义生成器:
def uniques(it):
seen = set()
for x in it:
if x not in seen:
yield x
seen.add(x)
但我的预感是,这将比一次性构建一套更慢。无论如何,内存消耗大致相同。
答案 1 :(得分:1)
对我来说,使用发电机希望实现的目标并不完全清楚。
有一件事是清楚的:它不会降低内存需求,因为为了确定当前元素是否唯一,生成器需要知道所有以前看到的唯一元素。
此外,在list(set(...))
中构建列表的目的并不完全清楚。为什么不坚持你已经建造的那套?
答案 2 :(得分:0)
使用生成器而不是静态集合有两个可能的好处,其中只有一个(可能)适用于此:
内存使用情况。这里不适用,因为为了生成唯一身份,你需要O(n)内存这种方式或其他
时间 - 如果您希望仅消耗部分生成的输出,那么您可以通过延迟生成来节省时间。所以,如果这是你的情况,那么使用发电机可以节省一些处理能力。当然,为了懒惰地产生唯一身份,你需要记住已经产生的一组值(见上文)并在你去的时候过滤掉它们。