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进行访问较为繁琐~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值