适用于许多变量的高效python for循环

时间:2014-11-09 22:00:20

标签: python numpy cpython

鉴于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已经需要一些时间。必须有可能做得更好。

1 个答案:

答案 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具有相同的行为,所以在这里。