电子说
python迭代工具自动调用迭代对象next方法,对迭代对象进行遍历。
python的for循环、列表解析、map方法、生成器表达式、生成器方法都是迭代工具。
python可迭代对象包括:字符串、列表、元组、字典、集合、range、enumerate、文件等。
描述
timetool.py:计时模块,循环调用func函数1000次,返回使用时间和最后一次调用结果。
time.perf_counter():返回性能计数器的值,单位为秒。两次调用之间的差值用于计时。
timeiterenv.py:各种迭代环境调用内置函数ord(),返回列表。对各种迭代函数调用计时模块的计时函数进行计时,将计时结果存放在列表,并且按从低到高的顺序对计时结果进行排序。
sorted():key = lambda x:x[1],按自定义键函数进行排序,x为sorted的第1个参数对应排序对象,x[1]表示按第1个索引值进行排序,本例中对应函数计时结果。
通过例子得出:迭代环境调用内置函数耗时从低到高的顺序为:
NO | 函数 | 描述 |
---|---|---|
1 | mapCall | map迭代工具 |
2 | listComp | 列表解析 |
3 | genFunc | 生成器函数 |
4 | genExpr | 生成器表达式 |
5 | forloop | for循环 |
示例
# timetool.py
import time
reps = 1000
repslist = range(reps)
def timer(func,*pargs,**kargs):
begin = time.perf_counter()
for i in repslist:
ret = func(*pargs,**kargs)
usetime = time.perf_counter() - begin
return (usetime,ret)
# timeiterenv.py
import sys,timertool
s = '梯阅线条tyxt'*1000
def forloop():
res = []
for x in s:
res.append(ord(x))
return res
def listComp():
return [ord(x) for x in s]
def mapCall():
return list(map(ord,s))
def genExpr():
return list(ord(x) for x in s)
def genFunc():
def gen():
for x in s:
yield ord(x)
return list(gen())
print(sys.version)
reslist=[]
for test in (forloop,listComp,mapCall,genExpr,genFunc):
usetime,result = timertool.timer(test)
reslist.append((test.__name__,usetime,result[0],result[-1],len(result)))
print('-'*33)
reslistsort=sorted(reslist,key = lambda x:x[1])
for L in reslistsort:
print('%-9s:%.5f=>[%s....%s....%s]'%(L[0],L[1],L[2],L[3],L[4]))
print('-'*33)
# 迭代调用内置函数计时比较结果
# 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)]
# ---------------------------------
# mapCall :0.20925=>[26799....116....8000]
# listComp :0.42197=>[26799....116....8000]
# genFunc :0.57103=>[26799....116....8000]
# genExpr :0.57259=>[26799....116....8000]
# forloop :0.66177=>[26799....116....8000]
# ---------------------------------
描述
python各种迭代环境调用用户函数ord(x)+1,进行计时比较。
timertool.py不变,修改timeiterevn.py即可。
通过例子得出:迭代环境调用用户函数耗时从低到高的顺序为:
NO | 函数 | 描述 |
---|---|---|
1 | listComp | 列表解析 |
2 | genExpr | 生成器表达式 |
3 | genFunc | 生成器函数 |
4 | forloop | for循环 |
5 | mapCall | map迭代工具 |
示例
# timeiterevn.py
import sys,timertool
s = '梯阅线条tyxt'*1000
def forloop():
res = []
for x in s:
res.append(ord(x)+1)
return res
def listComp():
return [ord(x) for x in s]
def mapCall():
return list(map(lambda x:ord(x)+1,s))
def genExpr():
return list(ord(x)+1 for x in s)
def genFunc():
def gen():
for x in s:
yield ord(x)+1
return list(gen())
commstr = '# '
print(commstr+str(sys.version))
reslist=[]
for test in (forloop,listComp,mapCall,genExpr,genFunc):
usetime,result = timertool.timer(test)
reslist.append((test.__name__,usetime,result[0],result[-1],len(result)))
print(commstr+'-'*33)
reslistsort=sorted(reslist,key = lambda x:x[1])
for L in reslistsort:
print(commstr+'%-9s:%.5f=>[%s....%s....%s]'%(L[0],L[1],L[2],L[3],L[4]))
print(commstr+'-'*33)
# 调用用户函数计时比较结果
# 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)]
# ---------------------------------
# listComp :0.50272=>[26799....116....8000]
# genExpr :0.83316=>[26800....117....8000]
# genFunc :0.85477=>[26800....117....8000]
# forloop :0.94426=>[26800....117....8000]
# mapCall :0.96591=>[26800....117....8000]
# ---------------------------------
全部0条评论
快来发表一下你的评论吧 !