首页 > 解决方案 > 任何加速 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 个可能的组合。有什么方法可以在循环中添加“和”条件来加快速度?

标签: pythonnumpynested-loopsitertools

解决方案


许多改进是可能的。

对于初学者,可以使用itertools.combinations_with_replacement()减少搜索空间,因为求和是可交换的。

此外,最后一个加数应该计算而不是测试。例如,如果t[:4](10, 20, 30, 35),您可以计算t[4]1 - sum(t),给出值5。这将比尝试一百个x in值提速 100 倍(10, 20, 30, 35, x)


推荐阅读