python 装饰器记录函数用时
装饰器
# 用于记录函数平均用时的装饰器
def average_time_decorator(func):times = []def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()t = end_time - start_timetimes.append(t) # 记录用时print(f"{func.__name__} 的用时: {t:.6f} 秒")return resultdef get_avg_time():avg_time = sum(times)/len(times) if len(times) > 0 else 0.return avg_timedef clear_cache():nonlocal timestimes = []wrapper.get_avg_time = get_avg_timewrapper.clear_cache = clear_cachereturn wrapper
使用示例:
@average_time_decorator
def my_function():time.sleep(1)# 调用函数
my_function()
my_function()# 获取平均用时
print(f"平均用时: {my_function.get_avg_time():.6f} 秒")# 清空缓存
my_function.clear_cache()
这样,装饰器就能正确记录函数的用时,并提供获取平均用时和清空缓存的功能。
nolocal 关键字
nonlocal
关键字在 Python 中用于声明一个变量不是局部变量,而是来自包含它的直接外部函数的作用域。它只会影响直接上层函数的变量,而不会跨越多个层次。
示例
考虑以下多层嵌套的函数:
def outer_function():x = 10def middle_function():x = 20def inner_function():nonlocal xx = 30print("Inner function x:", x)inner_function()print("Middle function x:", x)middle_function()print("Outer function x:", x)outer_function()
输出将是:
Inner function x: 30
Middle function x: 30
Outer function x: 10
在这个例子中:
inner_function
中的nonlocal x
声明了x
是来自middle_function
的变量。inner_function
中的x = 30
语句修改了middle_function
中的x
,使其从 20 变为 30。outer_function
中的x
保持不变,仍然是 10。
总结
nonlocal
关键字只会影响直接上层函数的变量,而不会跨越多个层次。如果你需要修改更外层函数的变量,你需要在每一层都使用 nonlocal
声明。