python 计时装饰器@timer 用法及案例
在Python中,装饰器(decorator)是一种高级功能,它允许你在不修改原有函数或方法定义的情况下,为其添加额外的功能。计时装饰器(@timer
)是一个常见的例子,用于测量函数或方法的执行时间。
下面是一个简单的计时装饰器的实现及其用法案例:
计时装饰器实现
import time
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time() # 记录开始时间
result = func(*args, **kwargs) # 执行被装饰的函数
end_time = time.time() # 记录结束时间
elapsed_time = end_time - start_time # 计算耗时
print(f"Function '{func.__name__}' executed in {elapsed_time:.4f} seconds")
return result # 返回被装饰函数的执行结果
return wrapper
用法案例
@timer
def long_running_task():
# 模拟一个耗时操作
time.sleep(2)
print("Task completed!")
# 调用函数
long_running_task()
输出结果
Function 'long_running_task' executed in 2.0010 seconds
Task completed!
解释
- 装饰器定义:
timer
是一个装饰器函数,它接受一个函数func
作为参数,并返回一个新的函数wrapper
。 @wraps
:wraps
是一个来自functools
模块的装饰器,用于更新wrapper
函数的一些元数据,使其看起来更像原始的func
函数(例如,函数名和文档字符串)。- 记录时间:在
wrapper
函数内部,使用time.time()
记录函数开始执行和结束执行的时间。 - 计算耗时:通过减去开始时间来计算函数执行的耗时。
- 打印信息:打印一条消息,显示函数名和执行耗时。
- 返回结果:最后,返回被装饰函数的执行结果。
注意事项
- 装饰器可以应用于任何可调用对象(函数、方法、甚至是另一个装饰器)。
- 装饰器在函数定义之后、调用之前应用。
- 如果你的函数接受位置参数、关键字参数、可变参数或默认参数,装饰器应该能够正确处理这些参数(上面的
*args
和**kwargs
确保了这一点)。 - 装饰器在Python中非常强大,可以用于日志记录、输入验证、事务处理、缓存等多种场景。