内存错误 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 个整数。
我想用下面的行计算构建长度为 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 个整数。