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循环
由于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))