思路
python使用修饰器记录方法耗时,目的是每当方法执行完后,可以记录该方法耗时,而不需要在每个方法的执行前后,去创建一个临时变量,来记录耗时。
方式一(不推荐):
在每个方法的执行前后,去创建一个临时变量,来记录耗时,代码如下,缺点在于,如果有10个、100个方法,那不得写10次、100次?且这样去写,容易写漏,而且过于冗余
def fun():
# 开始计时
start_time = time.time()
# 模拟耗时
time.sleep(2)
# 停止计时
end_time = time.time()
print("fun01执行喽")
方式二(推荐):
使用装饰器来记录耗时,好处在于,将其标注在需要记录的方法前,这样的做法,相当于将这个方法,传递给另一个方法中。让方法A去执行方法B(俗称:套娃)。
这样的好处在于,我们只需要做标注,不用去改动到需要记录耗时的方法中的内容,这样可以减少出错和冗余,代码如下:
import time
# 使用装饰器,记录方法执行耗时
def timer(method_name):
def decorator(func):
def wrapper(*args, **kwargs):
# 开始计时
start_time = time.time()
# 执行方法
result = func(*args, **kwargs)
# 停止计时
end_time = time.time()
# 统计耗时并输出
execution_time = end_time - start_time
log = "{} 执行耗时: {:.2f} 秒".format(method_name, execution_time)
print(log)
return result
return wrapper
return decorator
# 方法1 使用装饰器标注
@timer("fun01()")
def fun01():
# 模拟耗时
time.sleep(2)
print("fun01执行喽")
# 方法2 不使用任何标注
def fun02():
# 模拟耗时
time.sleep(1)
print("fun02执行喽")
# 方法3 使用装饰器标注
@timer("fun03()")
def fun03():
# 模拟耗时
time.sleep(3)
print("fun03执行喽")
# 顺序执行fun01、02和03
fun01()
fun02()
fun03()
代码直接执行,可以看到如下的输出:
1.输出fun01()“执行喽”,却输出耗时是2.01秒,因为这里sleep了2秒,且使用了装饰器。
2.输出fun02()“执行喽”,但未记录执行耗时,原因是这里并未使用“装饰器”记录方法的耗时。
3.输出fun03()“执行喽”,却输出耗时是3.00秒,因为这里sleep了3秒,且使用了装饰器。
整理不易!
点赞!关注呗!