Python装饰器(计算函数运行花费时间)
python的装饰器和java的面向切面变成很相似,面向切面编程主要关心的是函数运行前(Before)和函数运行结束(After),可以针对函数前后做功能修复、功能插入工作,比如一些通用的打印日志,计算函数运行时间,拦截函数做一些事前处理, 相比而言python的装饰器更加灵活好用。
-
现在想要比较两个功能相同函数的性能,计算函数的运行时间
def parse_m3u8_file(m3u8_uri): pass # Before: 运行开始时间 # Running: 函数体运行中 # After: 运行结束时间 # 计算函数运行时间差并输出
完成这个功能,需要改写每个函数的函数体,并向上述描述添加重复代码,冗余而又乏味;有没有一种操作可以不用触及函数体的改动(或者微小改动)?装饰器可以优雅的完成这一功能。
import time def timefn1(fn): ''' :param fn: 被装饰器修饰的函数,将作为装饰器的默认参数传入 :return: 被装饰的函数本身 ''' def measure_use_time(*args, **kw): ''' 函数传参方式 fn(arg1, arg2, param1=a, param2=b) :param args: 位置参数(arg1, arg2, ....) 传参方式 fn(arg1, arg2, ...) :param kw: 字典参数{param1=a, param2=b, .....} 传参方式 fn(param1=a, param2=b, ....) :return: ''' t1 = time.time() res = fn(*args, **kw) t2 = time.time() print("@timefn: %s took %s" % (fn.__name__, t2-t1) return res return measure_use_time # 函数的定义上加@timefn1即可输出函数运行时间 ''' 形如: @timefn1 def parse_m3u8_file(m3u8_uri): pass '''
-
功能函数介绍:这个函数是对m3u8文件进行解析,提取其中的ts视频片段链接:
文件部分内容( 本文解析的m3u8文件附件):