使用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的效率很高。