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

针对多变量的高效python for循环,python,numpy,cpython,Python,Numpy,Cpython,给定p整数变量k_1,…,k_p,我想循环所有可能的k_I(I=1到p),这样k_I>=1(I=1到p)和k_1+k_2+…+k_{p-1}+k_p您应该查看itertools.product函数,并根据您的需要调整它。 由于条件k_1+k_2+…+k_{p-1}+k_p到底需要多少时间?生成该范围或如何使用它?您用numpy标记了该范围,这确实是以C速度循环的好方法,但您需要提供详细信息,确切说明您在循环体中所做的工作。假设您要计算f(idx)(其中f是某个函数)。举个简单的例子,可以考虑做s

给定
p
整数变量
k_1,…,k_p
,我想循环所有可能的
k_I(I=1到p)
,这样
k_I>=1(I=1到p)
k_1+k_2+…+k_{p-1}+k_p您应该查看
itertools.product
函数,并根据您的需要调整它。
由于条件
k_1+k_2+…+k_{p-1}+k_p到底需要多少时间?生成该范围或如何使用它?您用
numpy
标记了该范围,这确实是以C速度循环的好方法,但您需要提供详细信息,确切说明您在循环体中所做的工作。假设您要计算f(idx)(其中f是某个函数)。举个简单的例子,可以考虑做sum(idx)。对于m=10和p=9,这个循环已经需要一些时间。难怪需要很长时间,您正在执行该循环的387420489次迭代。idx是否指向p维数组中的某个位置?如果是这样,您可以考虑使用meshgrid生成相应的numpy索引数组。
for idx in itertools.product(range(1,m-1+1),repeat=p)
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