针对多变量的高效python for循环

2024-03-28 11:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

给定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(其中m是大于p的整数)。如何在python中高效地执行此循环?你知道吗

我试过:

for idx in itertools.product(range(1,m-1+1),repeat=p)

m=10p=m-1=9来说已经需要一些时间了。一定有可能做得更好。你知道吗


Tags: toinfor时间range整数productrepeat
1条回答
网友
1楼 · 发布于 2024-03-28 11:23:32

您应该查看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相同的行为,所以就是这样。你知道吗

相关问题 更多 >