Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中嵌套循环的缩进更少的替代方法_Python_Python 2.7_Indentation - Fatal编程技术网

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

Python中嵌套循环的缩进更少的替代方法,python,python-2.7,indentation,Python,Python 2.7,Indentation,我将此代码与一些实际的编码一起使用,这些编码需要封闭循环中的所有变量。我在想,如果迭代必须发生的范围是相同的,那么就必须有另一种方法,减少缩进,并且对所有变量都有相同的访问权限 有没有替代这种嵌套循环的方法 少压痕 在封闭范围内以相同顺序访问变量 守则: import itertools import time #My Way s = time.time() sums_pyramid = [0] * 36 for i in xrange(1,5): for j in xrange(

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

有没有替代这种嵌套循环的方法

  • 少压痕
  • 在封闭范围内以相同顺序访问变量
守则:

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)
计时结果

#My way
0.259999990463
#Lattyware's suggested way
0.310000181198
编辑2:

在Lattyware建议我应该使用
timeit
模块,而不是使用
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的代码更好。

假设(如您的示例中所示)循环都独立于父循环,您希望

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

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

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

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):
                    inner_loops(i, j, k, l, m)

def inner_loops(i, j, k, l, m):
    for n in xrange(1,5):
        for o in xrange(1,5):
            for p in xrange(1,5):
                for q in xrange(1,5):
                    pass
这将比
product()
性能差,可读性较差,但可能是必要的,具体取决于具体情况。当然,您可以根据需要使用任意多的函数,以尽可能减少嵌套

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

假设(如您的示例中所示)循环都独立于父循环,您希望

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

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

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

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):
                    inner_loops(i, j, k, l, m)

def inner_loops(i, j, k, l, m):
    for n in xrange(1,5):
        for o in xrange(1,5):
            for p in xrange(1,5):
                for q in xrange(1,5):
                    pass
这将比
product()
性能差,可读性较差,但可能是必要的,具体取决于具体情况。当然,您可以根据需要使用任意多的函数,以尽可能减少嵌套


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

问题是直接在列表后面的代码-显然,列表元素用于标记中的其他内容之后的缩进。问题是在列表元素用于标记中的其他内容后,直接在列表缩进后面的代码。编辑以修复。感谢您的回答。它确实帮助我提高了代码的可读性,并且大大减少了输入。关于效率,你的建议效率略低。我将更新这个问题,以包括计时结果。如果效率是指速度,那么情况就不应该是这样-
product()
在较低级别上迭代,在C代码中(假设您使用的是CPython),而普通循环由于是Python结构,所以开销更大
product()
在计时不重要的任何情况下都应该更快。@Zel问题可能与计时代码有关-请改用。
timeit模块
的结果有利于您的结果,我发现此模块专门用于测量执行时间。
time
模块如何?
time
是为在应用程序中使用时间而设计的,
timeit
是为测量代码而设计的,它做了许多事情来确保精确和具有代表性的计时。感谢您的回答。它确实帮助我提高了代码的可读性,并且大大减少了输入。关于效率,你的建议效率略低。我将更新这个问题,以包括计时结果。如果效率是指速度,那么情况就不应该是这样-
product()
在较低级别上迭代,在C代码中(假设您使用的是CPython),而普通循环由于是Python结构,所以开销更大
product()
在计时不重要的任何情况下都应该更快。@Zel问题可能与计时代码有关-请改用。
timeit模块
的结果有利于您的结果,我发现此模块专门用于测量执行时间。
time
模块如何?
time
是为在应用程序中使用时间而设计的,
timeit
是为测量代码而设计的,它做了许多事情来确保精确和具有代表性的计时。