Python中嵌套循环缩进较少的替代方法

2024-10-02 00:38:00 发布

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

我使用这段代码进行一些实际的编码,这些代码需要封闭循环中的所有变量。我在想,如果迭代的范围是相同的,那么必须有另一种方法,减少缩进,并且对所有变量的访问相同。在

有没有其他方法可以替代这种嵌套循环

  • 减少缩进
  • 在封闭范围内以相同顺序访问变量

代码:

import itertools
import time

#My Way
s = time.time()
sums_pyramid = [0] * 36
for i in xrange(1,5):
    for j in xrange(1,5):
        for k in xrange(1,5):
            for l in xrange(1,5):
                for m in xrange(1,5):
                    for n in xrange(1,5):
                        for o in xrange(1,5):
                            for p in xrange(1,5):
                                for q in xrange(1,5):
                                    sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1
print (time.time() - s)


#Lattyware's suggested way
s = time.time()
sums_pyramid = [0] * 36
for i,j,k,l,m,n,o,p,q in itertools.product(xrange(1,5), repeat = 9):
    sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1
print (time.time() - s)

计时结果

^{pr2}$

编辑2:

在Lattyware建议我不要使用time模块之后,我得到了这些结果

新代码:

import itertools

def p():
    #My Way
    sums_pyramid = [0] * 36
    for i in xrange(1,5):
        for j in xrange(1,5):
            for k in xrange(1,5):
                for l in xrange(1,5):
                    for m in xrange(1,5):
                        for n in xrange(1,5):
                            for o in xrange(1,5):
                                for p in xrange(1,5):
                                    for q in xrange(1,5):
                                        sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1


def q():
    #Lattyware's suggested way
    sums_pyramid = [0] * 36
    for i,j,k,l,m,n,o,p,q in itertools.product(xrange(1,5), repeat = 9):
        sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1

if __name__ == '__main__':
    times = 10
    from timeit import Timer
    print Timer(p, 'gc.enable()').timeit(number = times)

    print Timer(q, 'gc.enable()').timeit(number = times)

新计时:

1.60324387493
1.28266455309

这说明Lattyware的代码更好。在


Tags: 方法代码inimportpyramidfortimeprint
1条回答
网友
1楼 · 发布于 2024-10-02 00:38:00

假设(在您的例子中)这些循环都独立于父循环,那么您需要^{}。在

import itertools

for i, j, k, l, m, n, o, p, q in itertools.product(xrange(1, 5), repeat=9):
    ...

这里我使用repeat关键字参数作为速记,就像在您的示例中一样,iterables都是相同的,但是如果您的iterable不完全相同,您也可以传递多个iterable。在

它也将比许多嵌套循环更有效。请注意,有可能有更好的解决方案来解决您的问题-因为使用如此多的嵌套循环进行迭代很可能会产生大量的迭代,因此非常慢。在

或者,如果您的循环依赖于其父循环或类似的循环(因此product()不适合),您可以定义函数来去掉一些重嵌套并将其抽象出来。在

^{pr2}$

这将比product()更糟糕,可读性较差,但可能是必要的,具体取决于具体情况。当然,您可以根据需要使用任意多个函数,以尽可能减少嵌套。在

最后一点,我假设您将使用范围作为一个简单的示例,但是如果您计划使用索引循环数据结构,请不要!它很难阅读,死板而且缓慢。直接在数据结构本身上循环——这些方法可以很好地(事实上,更好地)工作。在

相关问题 更多 >

    热门问题