我试图生成所有可能的长度为40的二进制数,所以我使用了以下代码:
l = list(itertools.product([0, 1], repeat=40))
但是我遇到了一个内存问题,该进程被杀死,并且我正在使用具有64GB RAM的功能强大的计算机,那么这个问题有什么解决方案吗?
答案 0 :(得分:2)
您正在尝试生成2 ^ 40(即超过1万亿个)列表,每个列表包含40个整数元素。由于Python int
的长度为24个字节,即使使用最基本的假设(不计算列表开销等),也需要960 TB的RAM。
不是的解决方案是尝试将生成器转换为列表并直接使用生成器:
>>> l = itertools.product([0, 1], repeat=40)
>>> l.next()
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
>>> l.next()
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
>>> l.next()
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)
...
问题是您无法len(l)
(但是您已经知道结果了,不是吗?)并且您无法对其进行切片。