我想用下面的行
计算构建长度为n的二进制列表的所有可能方法combinations = map(list, itertools.product([0, 1], repeat=n))
这适用于低n,但我想计算大n(即25-35之间的值)。是否有更好,更有效的方法来生成此列表?
答案 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整数。