python迭代工具计时比较

1 python迭代工具计时比较

python迭代工具自动调用迭代对象next方法,对迭代对象进行遍历。

python的for循环、列表解析、map方法、生成器表达式、生成器方法都是迭代工具。

python可迭代对象包括:字符串、列表、元组、字典、集合、range、enumerate、文件等。

1.1 python迭代调用内置函数计时比较

描述

timetool.py:计时模块,循环调用func函数1000次,返回使用时间和最后一次调用结果。

time.perf_counter():返回性能计数器的值,单位为秒。两次调用之间的差值用于计时。

timeiterenv.py:各种迭代环境调用内置函数ord(),返回列表。对各种迭代函数调用计时模块的计时函数进行计时,将计时结果存放在列表,并且按从低到高的顺序对计时结果进行排序。

sorted():key = lambda x:x[1],按自定义键函数进行排序,x为sorted的第1个参数对应排序对象,x[1]表示按第1个索引值进行排序,本例中对应函数计时结果。

通过例子得出:迭代环境调用内置函数耗时从低到高的顺序为:

NO函数描述
1mapCallmap迭代工具
2listComp列表解析
3genFunc生成器函数
4genExpr生成器表达式
5forloopfor循环

示例

# 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]
# ---------------------------------

1.2 python迭代调用用户函数计时比较

描述

python各种迭代环境调用用户函数ord(x)+1,进行计时比较。

timertool.py不变,修改timeiterevn.py即可。

通过例子得出:迭代环境调用用户函数耗时从低到高的顺序为:

NO函数描述
1listComp列表解析
2genExpr生成器表达式
3genFunc生成器函数
4forloopfor循环
5mapCallmap迭代工具

示例

# 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]
# ---------------------------------

1.3 python迭代工具最小计时

描述

timertool.py:

timer_compatible():根据win版、Unix版、python版本选择对应计时函数计算总时间。

mintime():计算每个迭代工具执行的最小时间。

timeiterevn.py:

timeiter_compatible():计算每个迭代工具执行的总时间、平均时间、最小时间。

示例

#timertool.py
import time,sys
reps = 1000
repslist = range(reps)

if sys.version[:3]<'3.3':
   if sys.platform[:3] == 'win':
       timefunc = time.clock
   else:
       timefunc = time.time
else:
   timefunc = time.perf_counter
   
def trace(*args):
   #print('args={}'.format(args))
   pass

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)

def timer_compatible(func,*pargs,**kargs):
   _reps = kargs.pop('_reps',1000)
   trace(func,pargs,kargs,_reps)
   repslist = range(_reps)
   begin = timefunc()
   for i in repslist:
       ret = func(*pargs,**kargs)
   usetime = timefunc() - begin
   return (usetime,ret)
   
def mintime(func,*pargs,**kargs):
   _reps = kargs.pop('_reps',50)
   mintime = 2 ** 32
   for i in range(_reps):
       (usetime,ret) = timer_compatible(func,*pargs,_reps=1,**kargs)
       if usetime < mintime:
           mintime = usetime
   return (mintime,ret)
   
# 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())
def commstr(s):
   commstr = '# '+s
   print(commstr)
functp = (forloop,listComp,mapCall,genExpr,genFunc)
timetp = (timertool.timer_compatible,timertool.mintime)
commstr('-'*33) 
commstr(str(sys.version))
def timeiter():
   reslist=[]
   for test in funcList:
       usetime,result = timertool.timer(test)
       reslist.append((test.__name__,usetime,result[0],result[-1],len(result)))

   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]))
       commstr('%-9s:%.5f=>[%s....%s....%s]'%(L[0],L[1],L[2],L[3],L[4]))
   commstr('-'*33)   

def timeiter_compatible():
   _reps = 1000
   commstr('-'*33) 
   for ttp in timetp:
       reslist=[]
       commstr('<{}>'.format(ttp.__name__))
       for ftp in functp:
           usetime,result = ttp(ftp,_reps=_reps)
           reslist.append((ftp.__name__,usetime,result[0],result[-1],len(result)))
       commstr('-'*33) 
       reslistsort=sorted(reslist,key = lambda x:x[1])
       if ttp.__name__ == 'timer_compatible':
           commstr('总时间排序')
       else:
           commstr('最小时间排序')
       commstr('-'*33)
       for L in reslistsort:
           commstr('%-9s:%.5f=>[%s....%s....%s]'%(L[0],L[1],L[2],L[3],L[4]))
       commstr('-'*33) 
       if ttp.__name__ == 'timer_compatible':
           commstr('平均时间排序')
           commstr('-'*33)
           for L in reslistsort:
               commstr('%-9s:%.5f=>[%s....%s....%s]'%(L[0],(L[1]/_reps),L[2],L[3],L[4]))
           commstr('-'*33) 
timeiter_compatible()

# ---------------------------------
# 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)]
# ---------------------------------
# <timer_compatible>
# ---------------------------------
# 总时间排序
# ---------------------------------
# listComp :0.52310=>[26799....116....8000]
# genFunc  :0.92414=>[26800....117....8000]
# genExpr  :0.94791=>[26800....117....8000]
# forloop  :1.01522=>[26800....117....8000]
# mapCall  :1.12953=>[26800....117....8000]
# ---------------------------------
# 平均时间排序
# ---------------------------------
# listComp :0.00052=>[26799....116....8000]
# genFunc  :0.00092=>[26800....117....8000]
# genExpr  :0.00095=>[26800....117....8000]
# forloop  :0.00102=>[26800....117....8000]
# mapCall  :0.00113=>[26800....117....8000]
# ---------------------------------
# <mintime>
# ---------------------------------
# 最小时间排序
# ---------------------------------
# listComp :0.00039=>[26799....116....8000]
# genFunc  :0.00065=>[26800....117....8000]
# genExpr  :0.00066=>[26800....117....8000]
# forloop  :0.00072=>[26800....117....8000]
# mapCall  :0.00073=>[26800....117....8000]
# ---------------------------------

1.4 time计时

描述

python的time模块对Windows、Unix、python版本提供不同计时方法。

NO系统版本对应方法
1Windowstime.clock()
2Unixtime.time()
3<python3.8time.clock(),python3.8将移除
4>=python3.8time.perf_counter(),python3.3开始支持

两次调用之间的时间差用于计时。

示例

>>> import time
>>> begin = time.clock()
>>> end = time.clock()
>>> use=end - begin
>>> begin,end,use
(782.9449924, 793.3414938, 10.39650139999992)
>>> begin = time.time()
>>> end = time.time()
>>> use = end - begin
>>> begin,end,use
(1674368678.73148, 1674368685.6409733, 6.909493446350098)
>>> begin = time.perf_counter()
>>> end = time.perf_counter()
>>> use = end - begin
>>> begin,end,use
(899.3102242, 908.7626699, 9.452445699999998)

1.5 sys平台版本

描述

python通过sys模块获取平台版本信息。

NO属性描述
1sys.versionpython版本
2sys.platform系统平台

示例

>>> import sys
>>> v=sys.version
>>> pf=sys.platform
>>> v
'3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 07:55:33) [MSC v.1916 32 bit (Intel)]'
>>> pf
'win32'
>>> v[:3],pf[:3]
('3.7', 'win')

1.6 sorted按键排序

用法

sorted(iterable, /, *, key=None, reverse=False)

描述

python内置函数sorted(可迭代对象,key)属于迭代工具,按指定key对可迭代对象进行排序。

key:自定义排序函数。

reverse:默认False为升序。

示例

>>> zs={'name':'张三','yuwen':90,'shuxue':100,'english':60}
>>> ls={'name':'李四','yuwen':91,'shuxue':95,'english':85}
>>> ww={'name':'王五','yuwen':80,'shuxue':99,'english':82}
>>> classOne=[zs,ls,ww]
>>> for i,stu in zip(range(1,len(classOneSort)+1),classOneSort):
    zf = stu['yuwen']+stu['shuxue']+stu['english']
    print("总分第{i:0>3}名:{d[name]:>4},语文={d[yuwen]:>3},数学={d[shuxue]:>3},英语={d[english]:>3},总分={zf:>3}".format(d=stu,zf=zf,i=i))

    
总分第001:  李四,语文= 91,数学= 95,英语= 85,总分=271
总分第002:  王五,语文= 80,数学= 99,英语= 82,总分=261
总分第003:  张三,语文= 90,数学=100,英语= 60,总分=250

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值