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

写一个记录函数执行时间的装饰器

装饰器,这可是Python开发中绕不开的经典话题,不论你是写代码的老手,还是刚入行的萌新,都得和它打上几轮交道。而记录函数执行时间这个功能,更是装饰器中的“常客”。

今天我就带大家来全面解锁一下这块儿的知识,先从最基础的实现聊起,然后逐步深入,最终给出面试中的“加分”回答。坐稳了,开始上代码!

先聊聊装饰器是干啥的。简单说,装饰器就是一个“增强器”,能在不改动原始函数代码的情况下,为函数加上一些“外挂技能”,比如记录函数执行时间、打印日志、检查权限等等。

这里我们要完成的是统计一个函数的执行时间,便于分析代码性能、找到瓶颈。咱们一步步走,从函数装饰器讲起,然后再聊类装饰器和可参数化的装饰器。

先来说说最简单的实现,咱们可以用一个函数来实现记录函数执行时间的装饰器。装饰器的核心思想就是在不改动原有函数的前提下,给它添加额外的功能。

通常我们通过装饰器为一个函数增加一些处理逻辑,而不是直接改动函数本身。这个装饰器会在函数执行之前记录一下开始时间,函数执行完后计算并输出它的执行时间。

在这个代码里,我们用到了 wraps 装饰器,目的就是保留原函数的元数据,比如函数名和文档字符串等,不然 record_time 装饰过的函数在外部调用时会丢失掉它的元信息。record_time 装饰器很通俗易懂——先记录开始时间,运行函数,最后计算并输出执行时间。

装饰一个函数的步骤也很简单,直接在目标函数前加上 @record_time 即可:

运行这个代码,终端里就能看到 example_function 的执行时间。

这只是装饰器的一种实现方式。我们还可以用类来实现装饰器。之所以这样做,是因为类装饰器提供了更高的灵活性。

通过 __call__ 方法,类的实例可以像函数一样被调用,从而实现和函数装饰器类似的效果。很多情况下,类装饰器能更方便地管理状态。来看下面这个例子:

使用这个类装饰器和函数装饰器一样简单:

这个类装饰器的优点之一是可以轻松管理多个属性和复杂状态。比如说我们想在装饰器中加入一些配置选项,或者记录函数被调用的次数,用类实现会更简洁清晰。

说到装饰器,就不得不提参数化装饰器。这类装饰器允许我们传入参数,根据不同的需求控制装饰器的行为。

比方说,如果我们不想直接在终端中输出函数的执行时间,而是希望调用者自定义执行时间的输出方式,这种情况就可以用参数化装饰器来实现。

假设我们有一个自定义输出函数:

使用的时候直接传入 custom_output 函数:

运行这段代码后,会看到 custom_output 控制输出格式,这样就完全实现了执行时间的自定义输出。

到这里,我们已经看了三种不同类型的记录执行时间装饰器:函数装饰器、类装饰器、参数化装饰器。在实际开发中,灵活选用合适的装饰器能显著提升代码的复用性和可读性。

如果在面试中被问到如何实现一个记录执行时间的装饰器,回答这个问题的关键在于要展示你对装饰器基本概念的理解,最好能清晰地解释每种实现方式的优势。我们可以这么回答:

装饰器是Python中一种实现增强功能的工具,通过装饰器可以在不改变原函数的情况下添加新的功能。我来举一个简单例子,通常记录执行时间的装饰器可以通过函数或类来实现。

函数装饰器实现起来简单直观,但类装饰器提供了更强的灵活性,尤其适合需要维护内部状态或配置的场景。

此外,如果有需要自定义输出方式的需求,我会使用参数化装饰器,这样可以传入不同的输出函数,灵活控制输出内容和格式。比如,可以用它将执行时间记录到文件或发送到监控系统。


http://www.mrgr.cn/news/69498.html

相关文章:

  • Leetcode:118. 杨辉三角——Java数学法求解
  • 大数据应用开发——实时数据处理(一)
  • SpringCloud篇(微服务)
  • LeetCode【0038】外观数列
  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)
  • 3D意识(3D Awareness)浅析
  • svgicon大小问题(简单记录
  • 【线性代数\矩阵论】矩阵逆引理证明、应用
  • 力扣 多数元素
  • 深度学习在图像识别中的应用
  • 用Java实现samza转换成flink
  • 使用多种机器学习调参模型进行二分类建模的全流程,代做分析辅导
  • 软件工程。
  • C 语言变量
  • 计算机毕业设计Python+大模型动漫推荐系统 动漫视频推荐系统 机器学习 协同过滤推荐算法 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计
  • 硬件基础知识补全计划【七】MOS 晶体管
  • Oasis AI Minecraft:全球首个全AI驱动实时生成游戏的潜力与挑战
  • 移动应用开发:简易登录页
  • 【DCCMCI】多模态情感分析的层次去噪、表征解纠缠和双通道跨模态-上下文交互
  • 不想付费?这款免费软件满足你所有文件同步的需求
  • 从经典到应用:探索 AlexNet 神经网络
  • html5+css3(css2现状,css3选择器,属性选择器,结果伪类选择器,伪元素选择器)
  • 智能合约在供应链金融中的应用
  • HTML5+css3(浮动,浮动的相关属性,float,解决浮动的塌陷问题,clear,overflow,给父亲盒子加高度,伪元素)
  • 2024系统分析师---统一过程(淘宝押题)
  • 【Ubuntu24.04】部署服务(基础)