我正在使用itertools.product()
来获取列表中所有子列表的笛卡尔积。
arr = [[0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
result = itertools.product(*arr)
但是,arr
可以是一个非常大的对象(2 <= len(arr) <= 500)
,因此result
可以更大。
那么,有什么办法可以批量执行此操作?或以其他任何方式占用对象较少的内存?
答案 0 :(得分:1)
ID Pair_ID Sim_Value
1 1 1.00
1 2 8.33
.
.
.
.
2 1 8.33
之所以已经有效,是因为它返回一个迭代器:其itertools.product
的内存复杂性,其中O(n)
是列表的大小。
您也可以使用python文档上itertools recipes section中定义的函数n
代替powerset
:
itertools.product
def powerset(iterable):
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
-> powerset([1,2,3])
但是,由于幂集的基数为() (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)
,因此迭代powerset上所有项目的算法的时间复杂度为O(2^n)
。
结论是,如果2^n
大,您将无法遍历大小为n
的列表的幂集中的所有项目