网站专题页ps教程,个人开发游戏,辽宁建设工程信息网评标系统,网站为什么功能需求1 python函数装饰器参数统计调用时间和次数
python在函数装饰器外层定义一个函数生成封闭作用域来保存装饰器入参#xff0c;供装饰器使用。
1.1 装饰器统计调用时间和次数
描述
通过类的可调用实例装饰器来统计函数每次调用时间和总调用时间#xff0c;以及调用次数。
…1 python函数装饰器参数统计调用时间和次数
python在函数装饰器外层定义一个函数生成封闭作用域来保存装饰器入参供装饰器使用。
1.1 装饰器统计调用时间和次数
描述
通过类的可调用实例装饰器来统计函数每次调用时间和总调用时间以及调用次数。
1 time.perf_counter()获取当前时间单位秒
2 调用函数func前和后的时间差为func的执行时间usetime
3 将每次的执行时间usetime累加获得总时间alltime
4 每调用一次funccalls计增一次获得总次数
5 比较列表解析和map内置函数生成列表的调用时间
6 map在py2返回列表在py3返回迭代器需用list转为列表
示例 import time,sysclass TimeCount:def __init__(self,func):self.funcfuncself.alltime0self.calls0def __call__(self,*args,**kargs):begintime.perf_counter()resself.func(*args,**kargs)usetimetime.perf_counter()-beginself.alltimeusetimeself.calls1callstr 调用 {0[0]} {0[1]} 次 calltplself.func.__name__,self.callstimestr{0[0]}:usetime{0[1]:.6f},alltime{0[2]:.6f}timetplself.func.__name__,usetime,self.alltimeresstrres[0]{0[0]},res[-1]{0[1]},len(res){0[2]}restplres[0],res[-1],len(res)print(callstr.format(calltpl).center(50,-))print(timestr.format(timetpl))print(resstr.format(restpl),\n) TimeCount
def listcomp(N):return [x*2 for x in range(N)] if sys.version_info[0]2:TimeCountdef mapcall(N):return map((lambda x:x*2),range(N))
else:TimeCountdef mapcall(N):# py3的map返回迭代器需用list转换# 否则统计的时间与listcomp不一致return list(map((lambda x:x*2),range(N))) xtpl5,50000,500000,1000000tuple(map(listcomp,xtpl))
---------------- 调用 listcomp 1 次 -----------------
listcomp:usetime0.000005,alltime0.000005
res[0]0,res[-1]8,len(res)5 ---------------- 调用 listcomp 2 次 -----------------
listcomp:usetime0.002395,alltime0.002400
res[0]0,res[-1]99998,len(res)50000 ---------------- 调用 listcomp 3 次 -----------------
listcomp:usetime0.026660,alltime0.029060
res[0]0,res[-1]999998,len(res)500000 ---------------- 调用 listcomp 4 次 -----------------
listcomp:usetime0.053023,alltime0.082084
res[0]0,res[-1]1999998,len(res)1000000 (None, None, None, None)tuple(map(mapcall,xtpl))
----------------- 调用 mapcall 1 次 -----------------
mapcall:usetime0.000005,alltime0.000005
res[0]0,res[-1]8,len(res)5 ----------------- 调用 mapcall 2 次 -----------------
mapcall:usetime0.003963,alltime0.003968
res[0]0,res[-1]99998,len(res)50000 ----------------- 调用 mapcall 3 次 -----------------
mapcall:usetime0.041263,alltime0.045231
res[0]0,res[-1]999998,len(res)500000 ----------------- 调用 mapcall 4 次 -----------------
mapcall:usetime0.083637,alltime0.128868
res[0]0,res[-1]1999998,len(res)1000000 (None, None, None, None){:.6f}.format(mapcall.alltime)
0.128868{:.6f}.format(listcomp.alltime)
0.082084{:.6f}.format(mapcall.alltime/listcomp.alltime)
1.5699571.2 嵌套函数统计电影时间和次数
描述
通过嵌套函数来统计函数每次调用时间和总调用时间以及调用次数。
1 time.perf_counter()获取当前时间单位秒
2 调用函数func前和后的时间差为func的执行时间usetime
3 将每次的执行时间usetime累加获得总时间alltime
4 每调用一次funccalls计增一次获得总次数
5 比较列表解析和map内置函数生成列表的调用时间
6 map在py2返回列表在py3返回迭代器需用list转为列表
7 将alltime和calls赋值给func进行返回供后续获取
8 通过nonlocal修改嵌套作用域的变量alltime和calls
示例 import time,sysdef timecount_func(func):alltime0calls0def tcf_wrapper(*pargs,**kargs):begin time.perf_counter()resfunc(*pargs,**kargs)usetime time.perf_counter() - beginnonlocal alltimenonlocal callsalltimeusetimecalls1timestr{0[0]}:usetime{0[1]:.6f},alltime{0[2]:.6f}timetplfunc.__name__,usetime,alltimecallstr 调用 {0[0]} {0[1]} 次 calltplfunc.__name__,callsresstrres[0]{0[0]},res[-1]{0[1]},len(res){0[2]}restplres[0],res[-1],len(res)print(callstr.format(calltpl).center(50,-))print(timestr.format(timetpl))print(resstr.format(restpl),\n)func.alltimealltimefunc.callscallsreturn tcf_wrapper def listcomp(N):return [x*2 for x in range(N)] if sys.version_info[0]2:def mapcall(N):return map((lambda x:x*2),range(N))
else:def mapcall(N):return list(map((lambda x:x*2),range(N))) xtpl5,50000,500000,1000000tuple(map(timecount_func(listcomp),xtpl))
---------------- 调用 listcomp 1 次 -----------------
listcomp:usetime0.000005,alltime0.000005
res[0]0,res[-1]8,len(res)5 ---------------- 调用 listcomp 2 次 -----------------
listcomp:usetime0.002478,alltime0.002482
res[0]0,res[-1]99998,len(res)50000 ---------------- 调用 listcomp 3 次 -----------------
listcomp:usetime0.031966,alltime0.034448
res[0]0,res[-1]999998,len(res)500000 ---------------- 调用 listcomp 4 次 -----------------
listcomp:usetime0.068800,alltime0.103248
res[0]0,res[-1]1999998,len(res)1000000 (None, None, None, None)tuple(map(timecount_func(mapcall),xtpl))
----------------- 调用 mapcall 1 次 -----------------
mapcall:usetime0.000006,alltime0.000006
res[0]0,res[-1]8,len(res)5 ----------------- 调用 mapcall 2 次 -----------------
mapcall:usetime0.004435,alltime0.004441
res[0]0,res[-1]99998,len(res)50000 ----------------- 调用 mapcall 3 次 -----------------
mapcall:usetime0.041257,alltime0.045698
res[0]0,res[-1]999998,len(res)500000 ----------------- 调用 mapcall 4 次 -----------------
mapcall:usetime0.082711,alltime0.128409
res[0]0,res[-1]1999998,len(res)1000000 (None, None, None, None){:.6f}.format(mapcall.alltime)
0.128409{:.6f}.format(listcomp.alltime)
0.103248{:.6f}.format(mapcall.alltime/listcomp.alltime)
1.2436931.3 函数装饰器参数
通过装饰器参数指定配置选项。在装饰的时候传入一个标签和一个跟踪控制标志。
提供一个输出标签以及打开或关闭跟踪消息
用法
def close_scope_func(label,traceTrue):def decorator(func):def onCall(*args):passfunc(*args)passreturn decoratorclose_scope_func(梯阅线条)
def test_func(x):passtest_func(tyxt)描述
装饰器参数需在外层添加一个函数生成一个封闭作用域用来保存参数供装饰器使用。
1 在装饰器外层定义一个函数并且指定装饰器需要的入参
2 外层函数需返回一个可调用的装饰器给到被装饰函数
3 装饰函数时传入对应入参即可
示例 import time,sysdef timecount_ctr(label,traceTrue):class TimeCount:def __init__(self,func):self.funcfuncself.alltime0self.calls0def __call__(self,*args,**kargs):begintime.perf_counter()resself.func(*args,**kargs)usetimetime.perf_counter()-beginself.alltimeusetimeself.calls1if trace:callstr 调用 {0[0]} {0[1]} 次 callvalself.func.__name__,self.callstimestr{0[0]}:usetime{0[1]:.6f},alltime{0[2]:.6f}timevalself.func.__name__,usetime,self.alltimeresstrres[0]{0[0]},res[-1]{0[1]},len(res){0[2]}resvalres[0],res[-1],len(res)print(label,callstr.format(callval).center(50,-))print(label,timestr.format(timeval))print(label,resstr.format(resval),\n)return TimeCount timecount_ctr([listcomp])
def listcomp(N):return [x*2 for x in range(N)] if sys.version_info[0]2:timecount_ctr([mapcall])def mapcall(N):return map((lambda x:x*2),range(N))
else:timecount_ctr([mapcall])def mapcall(N):# py3的map返回迭代器需用list转换# 否则统计的时间与listcomp不一致return list(map((lambda x:x*2),range(N))) xtpl5,50000,500000,1000000tuple(map(listcomp,xtpl))
[listcomp] ---------------- 调用 listcomp 1 次 -----------------
[listcomp] listcomp:usetime0.000005,alltime0.000005
[listcomp] res[0]0,res[-1]8,len(res)5 [listcomp] ---------------- 调用 listcomp 2 次 -----------------
[listcomp] listcomp:usetime0.002641,alltime0.002646
[listcomp] res[0]0,res[-1]99998,len(res)50000 [listcomp] ---------------- 调用 listcomp 3 次 -----------------
[listcomp] listcomp:usetime0.027689,alltime0.030335
[listcomp] res[0]0,res[-1]999998,len(res)500000 [listcomp] ---------------- 调用 listcomp 4 次 -----------------
[listcomp] listcomp:usetime0.052438,alltime0.082773
[listcomp] res[0]0,res[-1]1999998,len(res)1000000 (None, None, None, None)tuple(map(mapcall,xtpl))
[mapcall] ----------------- 调用 mapcall 1 次 -----------------
[mapcall] mapcall:usetime0.000004,alltime0.000004
[mapcall] res[0]0,res[-1]8,len(res)5 [mapcall] ----------------- 调用 mapcall 2 次 -----------------
[mapcall] mapcall:usetime0.003975,alltime0.003979
[mapcall] res[0]0,res[-1]99998,len(res)50000 [mapcall] ----------------- 调用 mapcall 3 次 -----------------
[mapcall] mapcall:usetime0.040665,alltime0.044644
[mapcall] res[0]0,res[-1]999998,len(res)500000 [mapcall] ----------------- 调用 mapcall 4 次 -----------------
[mapcall] mapcall:usetime0.098298,alltime0.142942
[mapcall] res[0]0,res[-1]1999998,len(res)1000000 (None, None, None, None){:.6f}.format(mapcall.alltime)
0.142942{:.6f}.format(listcomp.alltime)
0.082773{:.6f}.format(mapcall.alltime/listcomp.alltime)
1.726914