我正在完成涉及快速处理和大数据的编程挑战。我正在尝试生成一个数字范围的可能排列列表,然后搜索它们。
代码:
def generate_list(numA, numB):
combo = list(range(0, numB))
permutation_list = list(itertools.permutations(combo, numA))
print("initial dictionary length: " + len(permutation_list))
问题是,当A为6且B为25时,我的程序会大大减慢并占用大量RAM。它偷看了大约13场演出。列表的长度约为127密耳,每个对象的长度为6.这应该使用大约750兆内存,而不是13演出。发生了什么事?
编辑:数据只是数字。所以[[0,1,2,3,4,5],[0,1,2,3,4,6],......]
答案 0 :(得分:2)
列表或元组的每个元素都是指针。并且大小为4或8字节。以下假设后者。只计算列表中的指针和元组占用了一半的空间。其余的可能是对象头,大约48个字节。这得到公式:
(48+8+(8*6)) * 127000000 == 13208000000
大约是你的13千兆字节。
我建议尽一切可能避免产生完整的排列。
答案 1 :(得分:-1)
如何输出整个排列列表的示例如下:
import itertools
def combo(b):
for combination in range(0, b):
yield combination
def generate_list(numA, numB):
for l in itertools.permutations(combo(numB), numA):
yield list(l), len(l)
if __name__ == '__main__':
total_length = int()
with open('permutations', 'w+') as f:
f.write('[')
for permutation in generate_list(6, 25):
data, length = permutation
total_length += length
f.write(str(data) + ', ')
f.write(']\n')
print("initial dictionary length: " + str(total_length))
我已将您的代码转换为两个独立的生成器。一个给出组合,另一个给出排列。
您可以在没有MemoryError
的情况下计算整个事物并将其写入文件。一个非常大文件。或者你可以把它打印到stdout,直到你。
它还会告诉你最后的长度,而不需要大量的内存。