Skip to the content.

使用zip简化循环多列表迭代


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


如果有多个列表根据条件添加值,例如:

r_t = []
r_f = []
for i, v in enumerate(a):
    if b[i]:
        r_t.append(v)
    else:
        r_f.append(v)
return r_t, r_f

为了进行对比,使用计时装饰器:

import time
from functools import wraps

def timethis(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        r = func(*args, **kwargs)
        end = time.perf_counter()
        print('{}.{} : {}'.format(func.__module__, func.__name__, end - start))
        return r
    return wrapper

@timethis
def func1(a, b):
    r_t = []
    r_f = []
    for i, v in enumerate(a):
        if b[i]:
            r_t.append(v)
        else:
            r_f.append(v)
    return r_t, r_f

@timethis
def func2(a, b):
    r_t = [v for i, v in enumerate(a) if b[i]]
    r_f = [v for i, v in enumerate(a) if not b[i]]
    return r_t, r_f

@timethis
def func3(a, b):
    r_t = [i for i, v in zip(a, b) if v]
    r_f = [i for i, v in zip(a, b) if not v]
    return r_t, r_f

a = list(range(10000))
b = [(random.randint(1, 100) > 50) for i in range(10000)]
_ = func1(a, b)
_ = func2(a, b)
_ = func3(a, b)

由于func2使用了两次迭代,因此理论时间会长,但是测试多数情况下并不会达到两倍时间,少数情况会和func1持平,甚至更少,因此对于多个列表构建不是一个较好的方法。

在数据量100级别以下的时候,多数情况func1会优于func3,但是数据量增多到千、万以上时,func3优势会较为明显,多数情况优于func1,部分情况基本持平,zip的效率很高。