Python trick:zip—同时遍历多个等长列表

1. 问题场景

同时遍历两个长度为length的列表

2. 可选方案

  • 双层循环
  • 利用index单层循环访问
  • 利用zip单层循环访问

3. 实现代码

注意,这里对方法一是不公平的,因为后两个方法其实只对tmp赋值了length次,而方法一赋值了length^2次,并不严格符合题意,这里只是写出来做个对比,也为5.1部分做个铺垫

length = 100000
a = list(np.random.rand(length))
b = list(np.random.rand(length))
time1 = time()
# 方法一
for i in a:
    for j in b:
        tmp = i + j
time2 = time()
# 方法二
for i in range(length):
    tmp = a[i]+b[i]
time3 = time()
# 方法三
for i, j in zip(a,b):
    tmp = i + j
time4 = time()

print("列表长度:"+str(length))
print("方法一用时:"+str(round(time2-time1, 5)))
print("方法二用时:"+str(round(time3-time2, 5)))
print("方法三用时:"+str(round(time4-time3, 5)))

4. 性能分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 额外说明

5.1 方法一vs方法二

上述方法一与方法二的性能差距主要是因为前者双层循环,后者单层循环;
而如果同样单层循环下,for … in list_name 是比 for i in range(length) 方法更快的;
个人认为是由于方法一是直接访问元素,方法二需要先访问index,再用index访问元素,较麻烦

length = 10000000
a = list(np.random.rand(length))
time1 = time()
for i in a:
    b = i
time2 = time()
for i in range(length):
    b = a[i]
time3 = time()
print("列表长度:"+str(length))
print("方法一用时:"+str(round(time2-time1, 5)))
print("方法二用时:"+str(round(time3-time2, 5)))

在这里插入图片描述

5.2 方法二vs方法三

方法二和方法三性能差距不大,而方法二略逊于方法三的原因应该和5.1所述类似,其通过index进行访问较为繁琐~

发布了52 篇原创文章 · 获赞 4 · 访问量 2136

猜你喜欢

转载自blog.csdn.net/qq_42191914/article/details/103934126