内存错误 python 计算列表的排列

Memory error python computing permutations of list

我想用下面的行计算构建长度为 n 的二进制列表的所有可能方法

combinations = map(list, itertools.product([0, 1], repeat=n))

这适用于低 n,但我想计算大 n(即 25-35 之间的值)。是否有更好、更有效的方法来生成此列表?

只需创建列表 "lazily",以免一次性将整个内容存储在内存中:

n = some-largish-value

for i in itertools.product([0, 1], repeat=n):
   result = do_something_with(list(i))

您正在尝试为 n 项找到 0 和 1 的所有组合。这种组合的总数将是2**n。对于 n=30,这样的组合总数是 1073741824。很大不是吗?

为了消除内存错误,您应该使用 generator 动态组合 yield 而不是将它们存储为列表。另外,因为它只是 0 和 1 的组合。为什么不打印从 0'1'*n 的二进制数?

下面是实现此目的的迭代器:

def binary_combinations(num):
    my_binary_string = '1'*num
    my_int_num = int(my_binary_string, 2)
    format_string = '{'+':0{}b'.format(num)+'}'
    for i in xrange(my_int_num):
        yield format_string.format(i)
    else:
        raise StopIteration('End of Memory Issue!')

为了执行这个,做:

>>> for i in binary_combinations(3):
...     print i
...
000
001
010
011
100
101
110

这里n = 3。现在你可以将它与 n = 30, 40, .. 或任何你想要的一起使用 ;)

不,如果您真的想要一个列表列表,那么您的代码几乎可以尽可能地提高内存效率。您的问题是列表的大小,而不是您计算它的方式。

你知道 n=35 你会有 1,202,590,842,880 个元素吗?大多数(如果不是全部)台式计算机无法在内存中容纳这么多 python 个整数。