我对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
答案 0 :(得分:5)
您正在从输入列表的笛卡尔积中创建一个完整的列表,因此,除了input_list
之外,您现在还需要len(input_list) ** 2
个存储槽来存储所有结果。然后,您再次将该列表过滤为第4个列表。总而言之,对于N个项目,您需要2N +(N * N)个引用的内存。如果N为1000,则为100万和2000个引用,对于N = 1百万,则需要1亿加上200万个引用。等等
您的代码根本不需要创建group_to_find
列表, ,有两个原因:
您可以单独迭代和处理每对:
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点。
您在a
中得到的最终产品与itertools.product()
将会产生的对完全相同,因此除非您输入的值不是唯一的。您可以先使这些独特:
a = itertools.product(set(input_list), repeat=2)
再次,不要将其放在列表中。循环迭代并使用一对一生成的对。