【发布时间】:2022-11-02 22:59:44
【问题描述】:
我正在尝试使用以下代码获取整数的正确子集:
set1 = [9,10]
set2 = [9, 10, 23, 26, 27, 28, 31, 32, 33, 36, 38, 41, 43, 45, 46]
allsubsets = set(chain.from_iterable(combinations(set2, ss) for ss in range(len(set1)+1, len(set2))))
但是,当 set2 的大小大于 30 时,我在 allsubsets 行中出现内存错误。我想在不分配太多内存的情况下使这段代码高效。
自从,迭代工具组合已经是一个生成器函数,它快速且内存高效。我了解将其保存到集合中时会发生内存错误。我尝试使用itertools.islice() 将可迭代对象拆分为多个集合并执行下游操作。但是,即便如此,我也必须将迭代器保存到列表或集合中。否则迭代器在第一次切片后丢失。
您能否建议如何从大集合中获取正确的子集而不会出现内存错误?
更新:我意识到如果我们有大量子集,这种方法将不起作用。这将导致内存错误,特别是如果我们想要对它们进行下游操作。就运行时间和内存而言,它的计算成本也会很高。最好的办法是以我们不必获得如此大的子集列表的方式重新设计算法或代码。您重新设计的方式取决于您希望从代码中得到什么结果。
【问题讨论】:
-
你要求
allsubsets是一个非常大的集合。这不是你想要的吗?如果不是,您需要解释或展示您想对这些子集做什么。 -
@PresidentJamesK.Polk 是的,你是对的。这将是一个非常非常大的集合。我希望从
set2中提取大小为 3 的所有可能的子集组合,并且其中还应该包含set1的项目。
标签: python memory memory-management iterator generator