定义装饰器
我们将定义一个名为 timeit
的装饰器,用来测量并打印任何函数执行所需的时间。
import time
from functools import wraps
def timeit(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"Function '{func.__name__}' executed in {end - start:.4f} seconds.")
return result
return wrapper
装饰器的解释
-
导入模块:首先,我们导入了
time
模块来获取当前时间,以及wraps
函数来保持装饰后的函数的元信息(如函数名等)。 -
定义装饰器:
- 使用
@wraps(func)
装饰器来确保原函数的元数据不会丢失。 wrapper
函数是装饰器的实际逻辑,它会在被装饰的函数执行前后记录时间,并计算函数执行所花费的时间。
- 使用
-
记录时间:
- 在调用实际函数之前,记录开始时间
start
。 - 函数调用完成后,记录结束时间
end
。 - 计算并打印函数执行时间。
- 在调用实际函数之前,记录开始时间
-
返回结果:
wrapper
函数返回原函数的结果,确保不影响原函数的返回值。
示例使用装饰器
我们将使用 timeit
装饰器来装饰一个简单的函数,该函数模拟一些处理逻辑(例如,休眠一段时间来模拟执行时间)。
@timeit
def process_data(data):
"""模拟数据处理函数,休眠一段时间来模拟处理过程。"""
print("Processing data...")
time.sleep(2) # 模拟处理时间为2秒
return "Data processed"
# 调用被装饰的函数
result = process_data("some data")
print(result)
输出结果
执行上面的代码,你会看到如下输出:
Processing data...
Function 'process_data' executed in 2.00xxx seconds.
Data processed
此输出显示了函数名和执行时间,以及处理结果。通过这个装饰器,你可以非常方便地为任何函数添加执行时间记录功能,这在调试和优化中非常有用。