列出了13个演出的公羊,有127万个参赛作品:怎么样?

时间:2017-01-10 13:07:32

标签: python list

我正在完成涉及快速处理和大数据的编程挑战。我正在尝试生成一个数字范围的可能排列列表,然后搜索它们。

代码:

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],......]

2 个答案:

答案 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,直到你。

它还会告诉你最后的长度,而不需要大量的内存。