python 双重循环处理

350 阅读1分钟

序⾔

在开发过程中经常会遇到对可迭代对象进⾏for循环的操作,甚⾄双重编写for循环进⽽找到匹配条件的数据,

某些逻辑上这些操作往往⽆法避免,但可以通过⼀些⽅法使得代码不那么冗余和提升代码效率

循环的情况

1、循环⽐较

双重循环获取对象并进⾏⽐较

>>> a1 = [1, 3, 5, 2, 10]

>>> a2 = [5, 6, 1, 8]

>>> for i in a1:

        for j in a2:
            if i < j:
                print(i,j)

...

(1, 5)

(1, 6)

(1, 8)

(3, 5)

(3, 6)

(3, 8)

(5, 6)

(5, 8)

(2, 5)

(2, 6)

(2, 8)

可以通过itertools包对此种循环进⾏优化,不仅使得代码复杂度降低,也提升了执⾏速度

a1 = [1, 3, 5, 2, 10]

a2 = [5, 6, 1, 8]

@count_time
def base_func():

    for i in a1:
        for j in a2:
            if i < j:
                print(i, j)

@count_time
def itertools_func():
    for i in itertools.product(a1, a2):
        if i[0] < i[1]:
            print(i)
            
            
if __name__ == '__main__':
    base_func()
    itertools_func()
    
# 8.106231689453125e-06
# 4.053115844726562e-06

2、循环展开

将复杂嵌套数据内容展开,可以使⽤推导式进⾏实现

@count_time

def base_func():

    result = []
    for a in a1:
        for j in a:
            result.append(j)

@count_time
def itertools_func():
    value = [i for value in a1 for i in value]

if __name__ == '__main__':
    print(base_func())
    print(itertools_func())

# 8.106231689453125e-06
# 4.053115844726562e-06

3、已知集合⼤⼩

在已知集合⼤致数量进⾏双重for循环处理数据时,应该采⽤外⼩内⼤的原则,把⼤循环写在⾥⾯,⼩循环写在外边

@count_time
def outer_func():

    for i in range(10):
        for j in range(10000): 
            if i == j:
                print(i, j)

@count_time
def inner_func():

    for i in range(10000):
        for j in range(10):
            if i == j:
                print(i, j)

# 0.003239154815673828
# 0.004751205444335937