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

Python 中装饰器和内存回收的说明

文章目录

  • 前言
    • Python 中装饰器和内存回收的说明
      • 1. Python 中的装饰器
        • 1.1. 说明
        • 1.2. 装饰器示例
      • 2. Python 内存回收

前言

如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


Python 中装饰器和内存回收的说明

1. Python 中的装饰器

装饰器是 Python 中一种高阶函数(能接收 / 返回函数的函数),核心作用是在不修改原函数代码、不改变原函数调用方式的前提下,为函数增加额外功能。

1.1. 说明

装饰器的底层是闭包(内部函数引用外部函数变量,且外部函数返回内部函数),@ 是装饰器的语法糖,让代码更简洁。

1.2. 装饰器示例
importtimefrom functoolsimportwraps from common.logimportget_logging_by_file logger=get_logging_by_file(__file__)def sec_to_hms(seconds): h=int(seconds //3600)m=int((seconds%3600)//60)s=seconds%60# 不转int,保留小数 return f'{h:02d}:{m:02d}:{s:.2f}' # 秒保留2位小数 def time_task(fn):""" 记录任务耗时 Parameters----------fn Returns-------""" @wraps(fn)# 保留原函数的元信息 def wrapper(*args,**kwargs):# 通用参数 start_time=time.time()res=fn(*args,**kwargs)# 原样传递所有参数 elapse_time=time.time()-start_time logger.info(f"Task 耗时:{sec_to_hms(int(elapse_time))}")returnresreturnwrapper

说明:
*args与**kwargs 是 Python 的可变参数语法,能让函数接受任意数量和类型的参数。
*args - 位置参数(Arguments)

  • 接收所有位置参数,打包成元组(tuple)。
  • 用法:函数调用时传的所有没指定名称的参数。

示例:

deftest(*args):print(args)# 打印元组if__name__=='__main__':test(1,2,3)# 输出: (1, 2, 3)test("a","b")# 输出: ('a', 'b')test()


**kwargs - 关键字参数(Keyword Arguments)

  • 接收所有关键字参数,打包成字典(dict)
  • 用法:函数调用时所有key=value形式的参数

示例:

deftest(**kwargs):print(kwargs)# 打印字典if__name__=='__main__':test(a=1,b=2)# 输出: {'a': 1, 'b': 2}test(name="Kimi")# 输出: {'name': 'Kimi'}test()# 输出: {}


整体逻辑:

调用 decorated_func(1,y=2)↓ 进入 wrapper(*args, **kwargs)args=(1,),kwargs={'y':2}记录开始时间 ↓ 执行 fn(*args, **kwargs)→ 实际调用的是原函数 func(1,y=2)↓ 获取返回值 res ↓ 记录耗时日志 ↓ 返回 res

测试代码:

importtimefromcommon.utilsimporttime_task@time_taskdefhhh(str1,**kwargs):time.sleep(10)print(f'str1:{str1}')print(f'打印字典:{kwargs}')returnf'处理完成:{str1}
fromtest.assembly.Test1importhhhif__name__=='__main__':hhh('哈哈啊',kkk=231,ooo=22)

注意的是 装饰器的函数名与 被装饰器的命名要保持一致,否则会失败。


与下面被装饰器的命名保持一致。

测试:

2. Python 内存回收

Python 的内存回收是解释器自动管理内存的机制,目的是回收程序不再使用的内存空间,避免内存泄漏。Python 不用手动调用 free() 或 delete,核心靠 “引用计数” 为主,“分代回收 + 标记清除” 为辅。

Python 的 GC 机制可以拆解为:
1、引用计数(即时回收):
触发回收的场景:引用计数归 0、对象被显式删除(del)、变量重新赋值等;
优点:实时性高,垃圾产生立即回收;缺点:无法处理循环引用,且引用计数增减会有性能开销。
2、分代回收(后台异步回收):
分代规则:新创建的对象属于 0 代,经过一次 GC 存活则进入 1 代,再存活进入 2 代;
触发条件:当 0 代对象数量达到阈值(默认 700),会触发 0 代 GC;0 代 GC 执行一定次数(默认 10)后,触发 1 代 GC;1 代 GC 执行一定次数后,触发 2 代 GC。
3、标记 - 清除(解决循环引用):
流程:暂停程序 → 遍历所有对象,标记可达对象 → 清除不可达对象 → 恢复程序;
仅针对容器对象(列表、字典、类实例等),因为只有容器对象才会产生循环引用。
4、手动干预:可以通过 gc 模块手动控制 GC,比如 gc.enable()(开启 GC)、gc.collect()(强制触发回收)、gc.get_count()(查看各代对象数量)。
补充:内存泄漏的常见场景 —— 全局变量持有大对象、循环引用未被打破、未关闭的文件 / 网络连接等;可以用 objgraph、tracemalloc 等工具排查内存问题。

http://www.jsqmd.com/news/144535/

相关文章:

  • 基于IBERT的GTX收发器眼图测试实践
  • Open-AutoGLM怎么安装其他应用?99%新手忽略的3个核心步骤
  • Win7系统程序终止问题的全面修复方案
  • 152_尚硅谷_切片基本介绍和入门
  • gbase8s如何操作时间
  • 2025年重庆别墅改造公司实力推荐榜:旧房加层改造/别墅外墙改造/办公室改造服务商精选 - 品牌推荐官
  • 华为5G网管操作全解析:参数设置与实战指令
  • 费马点问题与旋转构造的巧妙应用
  • 3分钟快速部署Open-AutoGLM到安卓手机,无需Root权限的极简方案
  • P7275 计树
  • 【毕业设计】基于springboot的学生公寓系统基于springboot的公寓报修管理系统(源码+文档+远程调试,全bao定制等)
  • 15款大模型透明度测评:两款允许用户撤回数据不投喂AI(文末附报告领取方式)
  • 如何用Python轻松调用Open-AutoGLM?这4个避坑要点你必须知道
  • 从零构建AutoGLM系统,手把手实现企业级大模型自动化(实战指南)
  • 八猴渲染器烘焙学习
  • 网络安全入门三问:是什么?涵盖哪些领域?学完能成为黑客吗?
  • Java计算机毕设之基于springboot的大学学生公寓管理学生公寓系统学生信息管理、宿管员管理、公寓资产管理、缴费信息管理(完整前后端代码+说明文档+LW,调试定制等)
  • Vivado安装教程 - Vivado ML Standard(免费)版
  • 为什么顶级AI实验室都在悄悄测试Open-AutoGLM mlx?真相令人震惊
  • 深度解析 | 红蓝对抗实战:如何构建企业级网络安全主动防御体系?
  • 解析RTMP视频推流平台EasyDSS如何实现无人机推流直播
  • 2025年最新推荐:短视频代运营公司盘点,小红书代运营/抖音运营公司/抖音推广/抖音代运营/短视频运营公司短视频代运营服务商推荐榜单 - 品牌推荐师
  • 大模型开发新姿势:一文搞定向量嵌入+多模态检索+数据库优化,小白秒变AI大神!
  • 【V2X】ipa 和GSI简介
  • 费马点与旋转构造:三线段和最值问题的解法
  • 2025年上海代理记账生产厂家、诚信供应商推荐:靠谱的代理记账公司有哪些? - 工业品网
  • 流程图绘制规范与产品应用全解析
  • 新Mac必装应用:五款提升工作效率的神器推荐
  • 仅需4步!轻松完成智谱AI Open-AutoGLM本地部署(附完整脚本与配置模板)
  • 告别手动调参时代,Open-AutoGLM如何实现全流程自主优化?