鉴于p
整数变量k_1,..., k_p
,我想循环k_i (i=1 to p)
的所有可能值,使k_i>=1 (i= 1 to p)
和k_1+k_2+...+k_{p-1}+k_p<= m
(其中{{1} }是一个大于m
的整数。我怎么能在python中有效地执行这个循环?
我试过了:
p
for idx in itertools.product(range(1,m-1+1),repeat=p)
和m=10
已经需要一些时间。必须有可能做得更好。
答案 0 :(得分:1)
您应该查看itertools.product
功能并根据您的需要进行调整。
由于条件为k_1+k_2+...+k_{p-1}+k_p <= m
,而不是计算笛卡尔积中的所有可能组合并在之后过滤,break
每次总和已经超出限制m
时,因为添加更大整数而不是在下一次迭代中也将超过限制。根据您输入的数字,它会快得多。
原始来源: https://docs.python.org/2/library/itertools.html#itertools.product
def product(*args, **kwds):
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
我会尝试这些方法:
def product2(*args, **kwds):
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
temp = [[]]
for x in result:
for y in pool:
z = x+[y]
if sum(z) > m:
break
else:
temp.append(z)
result = temp
for prod in result:
yield tuple(prod)
测试(快速运行):
m = 10
p = 9
k = range(1,m-1+1)
for x in product2(k,repeat=p):
print x
不确定您是否只想要具有完全p
值的元组,但您似乎期望与product
具有相同的行为,所以在这里。