【问题标题】:Python: How to find proper subsets from large sets without getting Memory Error?Python:如何从大集合中找到适当的子集而不会出现内存错误?
【发布时间】: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


【解决方案1】:

难道你的“下游操作”本质上不包括迭代正确的子集并用它们做一些事情吗?如果是这样,请跳过您尝试转换为集合的部分。您可以迭代 itertools.chain 对象(生成器),如下所示:

set1 = [9,10]
set2 = [9, 10, 23, 26, 27, 28, 31, 32, 33, 36, 38, 41, 43, 45, 46]
allsubsets = chain.from_iterable(combinations(set2, ss) for ss in range(len(set1)+1, len(set2)))
for s in allsubsets:
    print(s)

只需将print(s) 部分替换为您需要做的任何事情。

set1set2 可以随心所欲,并且永远不会遇到内存问题。当然,如果您要迭代许多值,您的程序可能仍需要很长时间才能执行。

【讨论】:

  • 是的,我已经尝试过这个选项。即使在循环 allsubsets 时,我也遇到了内存错误,因为我正在过滤 allsubsets 以通过以下检查获得正确的集合:``` if set(set1).issubset(s) ``` 在 for环形。我需要确保只选择allsubsets 中具有set1 的子集。
猜你喜欢
  • 2019-09-24
  • 2021-05-23
  • 2015-08-02
  • 1970-01-01
  • 2021-05-18
  • 2018-02-03
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多