python - 任何加速 itertool.product 的方法
问题描述
我正在使用 itertools.product 来查找资产可以采用的可能权重,因为所有权重的总和为 100。
min_wt = 10
max_wt = 50
step = 10
nb_Assets = 5
weight_mat = []
for i in itertools.product(range(min_wt, (max_wt+1), step), repeat = nb_Assets):
if sum(i) == 100:
weight = [i]
if np.shape(weight_mat)[0] == 0:
weight_mat = weight
else:
weight_mat = np.concatenate((weight_mat, weight), axis = 0)
上面的代码可以工作,但是它太慢了,因为它通过了不可接受的组合,例如 [50,50,50,50,50] 最终测试了 3125 个组合而不是 121 个可能的组合。有什么方法可以在循环中添加“和”条件来加快速度?
解决方案
许多改进是可能的。
对于初学者,可以使用itertools.combinations_with_replacement()减少搜索空间,因为求和是可交换的。
此外,最后一个加数应该计算而不是测试。例如,如果t[:4]
是(10, 20, 30, 35)
,您可以计算t[4]
为1 - sum(t)
,给出值5。这将比尝试一百个x in值提速 100 倍(10, 20, 30, 35, x)
。
推荐阅读
- android - 为什么即使我将我的应用程序设置为外部存储,我也可以访问内部存储?
- java - 从Java中具有不同大小的2个数组列表中查找不相似的元素
- c++ - iOS 11.4.1 上的 Qt C++ 隐藏键盘
- assembly - resb 是创建指针还是未初始化的变量?
- python - 如何在没有静态的情况下在 Django 模板中显示图像?
- amazon-web-services - 将 Kafka 集群连接到 Aws Ec2 实例
- reactjs - 如何将 Shopify 网站集成到 React Native 应用程序中
- python - “缺少文档字符串”错误,即使我已经添加了它们
- javascript - 哪些参数最好存放在localStorage中?
- nlp - 文本分类中的异常检测