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

时间:2016-10-04 08:55:24

标签: python python-2.7 permutation combinatorics

我想用下面的行

计算构建长度为n的二进制列表的所有可能方法
combinations = map(list, itertools.product([0, 1], repeat=n))

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

3 个答案:

答案 0 :(得分:2)

只需创建“lazily”列表,以便不会立即将整个内容存储在内存中:

set_time_limit('1000');

答案 1 :(得分:1)

您正试图在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,..或者你想要的任何东西;)

答案 2 :(得分:0)

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

你是否意识到n = 35你会有1,202,590,842,880个元素?大多数(如果不是全部)台式计算机都无法在内存中保存这么多python整数。