python装饰器

13 阅读2分钟

定义装饰器

我们将定义一个名为 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

装饰器的解释

  1. 导入模块:首先,我们导入了 time 模块来获取当前时间,以及 wraps 函数来保持装饰后的函数的元信息(如函数名等)。

  2. 定义装饰器

    • 使用 @wraps(func) 装饰器来确保原函数的元数据不会丢失。
    • wrapper 函数是装饰器的实际逻辑,它会在被装饰的函数执行前后记录时间,并计算函数执行所花费的时间。
  3. 记录时间

    • 在调用实际函数之前,记录开始时间 start
    • 函数调用完成后,记录结束时间 end
    • 计算并打印函数执行时间。
  4. 返回结果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

此输出显示了函数名和执行时间,以及处理结果。通过这个装饰器,你可以非常方便地为任何函数添加执行时间记录功能,这在调试和优化中非常有用。