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
您应该查看
itertools.product
函数,并根据您的需要调整它。 由于条件k_1+k_2+...+k_{p-1}+k_p <= m
,不是计算笛卡尔积中所有可能的组合,而是在每次总和超过限制时break
循环m
,因为在下一次迭代中添加更大的整数也会超过限制。根据你的输入数字,它会快得多。你知道吗原始来源: https://docs.python.org/2/library/itertools.html#itertools.product
我会尝试以下方法:
测试(运行速度快):
但是,不确定您是否只需要
p
值的元组,但是您似乎期望与product
相同的行为,所以就是这样。你知道吗相关问题 更多 >
编程相关推荐