有以下函数:
def func_test():
lists = []
for i in range(10000000):
lists.append(i)
想要统计这个函数的调用时长怎么办???
一般解法:
def func_test():
start_time = time.time()
lists = []
for i in range(10000000):
lists.append(i)
end_time = time.time()
run_time = end_time - start_time
print("函数调用执行时长:"+str(run_time))
这时候又来个函数
def func_test_new():
lists = []
for i in range(10000000):
i *= 2
lists.append(i)
又要统计函数执行时长。。。这个时候如果再直接修改函数中的代码当然可以达到目的,但是看着就相当不舒服了,相同的代码需要写N次,在这种情况下,python提供了一种解决方案:使用装饰器
以上代码就可以修改为:
import time
def time_diff(func_name):
# func_name 为 外部传入的函数,注意:不带()
def wrapper():
# wrapper 为包装器,实现了需要增强原函数功能的部分
start_time = time.time()
print("开始执行的时间:" + str(start_time))
func_name() # 调用原函数的位置
end_time = time.time()
print("结束执行的时间:" + str(end_time))
run_time = end_time - start_time
print("函数执行的时长:" + str(run_time))
return func_name() # 包装器执行完,将原函数返回
return wrapper() # 将包装器执行结果返回给装饰器
@time_diff
def func_test():
lists = []
for i in range(10000000):
lists.append(i)
@time_diff
def func_test_new():
lists = []
for i in range(10000000):
i *= 2
lists.append(i)
@time_diff 标识为装饰器的用法
PS:其实Python装饰器和Java中的注解用法类似,但是实现会简单很多,后续会写一篇小论文,用来解释装饰器执行原理,祝大家日进斗金。



