当前位置: 首页 > news >正文

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

在这个例子中:

  1. inner_function 中的 nonlocal x 声明了 x 是来自 middle_function 的变量。
  2. inner_function 中的 x = 30 语句修改了 middle_function 中的 x,使其从 20 变为 30。
  3. outer_function 中的 x 保持不变,仍然是 10。

总结

nonlocal 关键字只会影响直接上层函数的变量,而不会跨越多个层次。如果你需要修改更外层函数的变量,你需要在每一层都使用 nonlocal 声明。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • stm32应用、项目
  • RNN循环网络层
  • PostgreSQL(二十五)PG_FDW的使用
  • SpringMVC快速学习
  • C#裁剪图像的几种方法总结
  • 关于使用Next遇到的一些新特性
  • 【C++】STL | vector 详解及重要函数的实现
  • 工作随记:我在OL8.8部署oracle rac遇到的问题
  • bpmn简单使用(制作流程图)
  • Mysql开启SSL
  • 鸿蒙Harmony开发:onFrame逐帧回调规范
  • 接了一个2000块的小活,大家进来看看值不值,附源码
  • MATLAB 与Gazebo联合仿真
  • 2024年必备技能:智联招聘岗位信息采集技巧全解析
  • KBEngine ue5
  • hexo+github搭建个人博客
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JAVA SE 6 GC调优笔记
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript异步流程控制的前世今生
  • maya建模与骨骼动画快速实现人工鱼
  • Redis 中的布隆过滤器
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue学习第二天
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 从重复到重用
  • 记一次用 NodeJs 实现模拟登录的思路
  • 开发基于以太坊智能合约的DApp
  • 面试总结JavaScript篇
  • 那些被忽略的 JavaScript 数组方法细节
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序开发问题汇总
  • 赢得Docker挑战最佳实践
  • 运行时添加log4j2的appender
  • Spring第一个helloWorld
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​【已解决】npm install​卡主不动的情况
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #大学#套接字
  • #数据结构 笔记三
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (7)STL算法之交换赋值
  • (第27天)Oracle 数据泵转换分区表
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .axf 转化 .bin文件 的方法
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .net和php怎么连接,php和apache之间如何连接
  • .net流程开发平台的一些难点(1)
  • .NET下的多线程编程—1-线程机制概述
  • .pyc文件是什么?
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑