python - 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
可以更大。
那么,有什么办法,可以分批做这个操作吗?或者以任何其他方式使对象占用更少的内存?
解决方案
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 中的所有项目
推荐阅读
- javascript - 如何在脸书上分享互动视频?
- c++ - 如何将 OpenSSL SSL/TLS 默认端口 [443] 更改为新端口?
- reactjs - 为在构造函数外部声明的 const 反应 setState
- javascript - 是否有一个 onclick 函数可以让我了解如何在 sql server 中搜索图像后显示图像?
- c - 如何更新保存在文件中的结构字段?
- javascript - 有没有办法在门户页面上呈现freshservice应用程序(请求者视图)
- javascript - 如何使用 HTTP 请求从 API 中删除数据 [React TS]
- r - 如何使用存储在 R 中的另外两个数据框中的列顺序从数据框中进行选择?
- android - 抽屉上的工具提示
- javascript - 打字稿找到后置摄像头的MediaDeviceInfo