首页 > 解决方案 > itertools.product 批量

问题描述

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可以更大。

那么,有什么办法,可以分批做这个操作吗?或者以任何其他方式使对象占用更少的内存?

标签: pythonitertools

解决方案


itertools.product已经很高效了,因为它返回了一个迭代器:它O(n)在内存中的复杂性在哪里n是列表的大小。

您还可以使用在 python 文档的itertools recipes 部分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)


但是,迭代幂集上所有项目的算法具有时间复杂O(2^n)度,因为幂集的基数是2^n

n结论是,如果n很大,您将无法遍历具有大小的列表的 powerset 中的所有项目


推荐阅读