python的for语句有几种写法_Python循环迭代的高效写法,亲测对比让你的代码速度更快...

Python的循环迭代有多种写法,我们实际常用的主要是for循环,列表推导,生成器函数和Map函数实现等四种:

列表推导式书写形式:

[表达式 for 变量 in 序列] 或者 [表达式 for 变量 in 列表 if 条件]

multiples = [表达式(i) for i in 序列]

生成一个名为multiples 的列表保存推导结果

2 .for循环推导书写形式:

tmplist = []

for i in 序列:

templist.append(表达式(i))

生成的tmplist列表保存推导结果

3 . 生成器推导书写形式:

list(表达式(i) for i in 生成器序列)

生成一个列表保存推导结果

4 . map函数推导书写形式:

list(map(表达式, 序列))

生成一个列表保存推导结果

你可知道哪种写法的速度最快?

今天我们亲自来测试下这四种写法,简单的以add()加1操作来对比,默认每个函数对10000000个数进行计算。

从测试结果可以看出效率从高到低依次为::

map函数 > 列表推导式 > 生成器推导式 > for循环

b4ad2160a4d1441bbfa9872632e13e2a

由于python3的改版,map都是返回迭代器了,所以python3的map()每次都要用list(map())将其转化为列表,即使如此,map的速度也是快一些。内置函数比如说map,filter,reduce(在Python3.0中移除)基本上都是用C语言来实现的,所以速度是最快的,列表推导内的迭代在解释器内是以C语言的速度运行的(一般是for循环的两倍,对大型文件操作而言,用列表推导效果尤其明显)。

import time

#初始化4个10000000大小的整数序列

afor, alist, agenerator, amap = (range(10000000), range(10000000), range(10000000), range(10000000))

#add函数执行每个数值加1的操作

def add(k):

return k + 1

#使用for循环对10000000的序列分别执行add

def fortest():

afortmp = []

start = time.time()

for i in afor:

afortmp.append(add(i))

end = time.time()

return (end - start)

#使用列表推导方式对10000000的序列分别执行add

def listtest():

start = time.time()

alistnew = [add(i) for i in alist]

end = time.time()

return (end - start)

#使用生成器推导方式对10000000的序列分别执行add

def generatortest():

start = time.time()

ageneratornew = list(add(i) for i in agenerator)

end = time.time()

return (end - start)

#使用map函数推导方式对10000000的序列分别执行add

def maptest():

start = time.time()

amapnew = list(map(add, amap))

end = time.time()

return (end - start)

if __name__ == '__main__':

#四种迭代方式分别计算得到10次耗时的平均值:

avgfortest = sum(fortest() for i in range(10)) / 10

avglisttest = sum(listtest()for i in range(10)) / 10

avggeneratortest = sum(generatortest() for i in range(10)) / 10

avgmaptest = sum(maptest() for i in range(10)) / 10

print('for循环10次平均用时:{:.2f} 秒'.format(avgfortest))

print('列表推导10次平均用时:{:.2f} 秒'.format(avglisttest))

print('生成器推导10次平均用时:{:.2f} 秒'.format(avggeneratortest))

print('map函数10次平均用时:{:.2f} 秒'.format(avgmaptest))

d1d43ba040f9419d986406a486b62364

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值