【发布时间】:2019-11-12 17:10:59
【问题描述】:
我正在使用 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 个可能的组合。有什么办法可以在循环中添加“和”条件来加快速度?
【问题讨论】:
-
在循环的最顶端,您可以使用
if过滤掉非法值。什么决定组合是否有效? -
重复
np.concatenate很慢。改用列表追加。 -
顺序重要吗?也就是
[50, 20, 10, 10, 10]和[10, 10, 10, 20, 50]一样吗? (因此应该只生产其中一个) -
对于给定的输入大小,使用简单的
list.append()而不是np.concatenate()已经使速度加倍(代码大约需要一半的时间)。我在this answer 中进行了这些比较。
标签: python numpy nested-loops itertools