在平常跑程序的过程中,经常会出现对某一过程计时的需求,之前通常是引用time模块,在该过程代码开始和结束位置记下时间,最后相减得到结果,如:
import time
start = time.time()
xxx
end = time.time()
t = end - start
使用这种方式每次计时都要多写几行代码,如果能把这种计时功能封装成函数就更简便了,最近在网上学习到了python装饰器就能实现这种封装。
装饰器是一种用来装饰函数或者类的特殊函数,其作用是在执行函数的基础上实现一些其他的功能,基础框架:
def outer(func):
def inner(*args, **kwargs):
# 实现其他功能的代码
result = func(*args, **kwargs)
# 实现其他功能的代码
return result
return inner
@outer
def func1():
pass
使用@语法装饰函数func1后,每次执行func1时相当于执行外函数outer(func1),其返回的是内函数inner,内函数会执行func1(*args, **kwargs)和其他功能。
程序计时装饰器实现和测试完整代码如下:
import time
import random
def record_time(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f'{func.__name__}执行时间:{end-start:.3f}秒')
return result
return wrapper
@record_time
def download(filename):
print(f'开始下载{filename}')
time.sleep(random.randint(5,10))
print(f'{filename}下载完成')
@record_time
def upload(filename):
print(f'开始上传{filename}')
time.sleep(random.randint(10,15))
print(f'{filename}上传完成')
@record_time
def main():
download('书籍1.pdf')
upload('视频1.avi')
download('视频2.mp4')
if __name__ == '__main__':
main()
record_time为装饰器函数,其内函数wrapper中执行func函数,同时记录开始结束时间,相减得到运行时间。download,upload为模拟下载和上传函数,运行时间随机,@装饰download、upload、main三个函数后,每次运行对应函数时即会计时。一次运行结果如下: