如何在python3中节省内存?

时间:2019-06-23 12:50:00

标签: python python-3.x itertools

我对python3.6中的内存错误有疑问

import itertools
input_list = ['a','b','c','d']
group_to_find = list(itertools.product(input_list,input_list))
a = []
for i in range(len(group_to_find)):
    if group_to_find[i] not in a:
       a.append(group_to_find[i])
    group_to_find = list(itertools.product(input_list,input_list))
MemoryError

1 个答案:

答案 0 :(得分:5)

您正在从输入列表的笛卡尔积中创建一个完整的列表,因此,除了input_list之外,您现在还需要len(input_list) ** 2个存储槽来存储所有结果。然后,您再次将该列表过滤为第4个列表。总而言之,对于N个项目,您需要2N +(N * N)个引用的内存。如果N为1000,则为100万和2000个引用,对于N = 1百万,则需要1亿加上200万个引用。等等

您的代码根本不需要创建group_to_find列表, ,有两个原因:

  1. 您可以单独迭代和处理每对:

    a = []
    for pair in itertools.product(input_list, repeat=2):
        if pair not in a:
            a.append(pair)
    

    这仍然会,因为pair not in a必须扫描整个列表以找到匹配项。您最多N对执行K次(其中K是input_list中唯一值数量的乘积,可能等于N),因此是N * K时间用于检查重复项。您可以使用a = set()来加快速度。但请参阅第2点。

  2. 您在a中得到的最终产品与itertools.product()将会产生的对完全相同,因此除非您输入的值不是唯一的。您可以先使这些独特:

    a = itertools.product(set(input_list), repeat=2)
    

    再次,不要将其放在列表中。循环迭代并使用一对一生成的对。

相关问题