我需要从一组 55 个数字中生成 6 个数字的每个组合。我相信该组组合中有 28,989,675 个索引。我想我的内存用完了,因为我可以生成 4 个数字的组合,但没有比这更大的数字了。我该如何解决这个问题?
我正在使用从这里的教程中借用的一些代码的修改:https://www.youtube.com/watch?v=VyXDQxuIwPU
import itertools
text_file = open("comb3.txt", "w")
harmonics = [28, 33, 36, 38, 40, 43, 45, 47, 48, 50, 52, 55, 55.86, 57, 59, 60, 60.86, 61.69, 62, 63.86, 64, 65.86, 66, 66.69, 67, 69, 69.69, 70.86, 71, 71.69, 72, 74, 75.86, 76, 76.69, 77.86, 79, 81, 81.69, 82.86, 83.69, 84, 84.86, 86, 88, 88.69, 89.86, 90.69, 91, 93, 95, 95.69, 96.86, 98, 100]
combos = itertools.combinations(harmonics, 4)
usable_combos = []
for e in combos:
usable_combos.append(e)
print usable_combos
s = str(usable_combos)
text_file.write(s)
text_file.close()
谢谢!
请您参考如下方法:
像 itertools.combinations 这样的迭代器一次只生成一段数据,这在内存效率上相对较高。但是,当您将所有值放入列表中时,您需要内存来一次存储所有这些值(顺便说一句,usable_combos = list(combos) 将替换您的 for 循环,并不是说你应该那样做)。
由于您正在将它们写入文件,因此您可以在从迭代器获取每个组合时将其写入文件,而不是创建列表。现在,您需要将其格式化为 Python 列表的 repr 吗?因为如果不是,这会更有意义:
for combo in combos:
text_file.write(str(combo) + "\n")
注意:由于分析而从使用 "{}\n".format(combo) 更改。
如果你想要它像列表的repr,你需要自己写[和],而不是逗号换行符。
-更多-
根据评论中的更新 - 如果您正在寻找特定的组合,寻找它们的最佳位置可能是在将它们写入文件之前,否则您只需将它们从文件中加载回来并查看再次对他们。如果您将根据某些标准选择可用组合的一小部分,那么预先选择它们将减少您以后的工作量。
一般来说,您还可以研究 Cython 以获得更快的速度,而无需学习实际的 C,如果您真的想对内存要求超出您自己计算机的内存要求进行暴力破解,适当大小的 EC2 实例就在附近每小时 20 美分。
