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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 桌面应用开发:使用 Tkinter 创建 GUI 应用程序

Python 桌面应用开发:使用 Tkinter 创建 GUI 应用程序 引言 随着计算机技术的飞速发展,桌面应用程序依然在许多领域中发挥着重要作用。Python 作为一种强大的编程语言,提供了多种工具和库来创建桌面应用程序。其中,Tkinter 是 P…

vue3入门知识(一)

vue3简介 性能的提升 打包大小减少41%初次渲染快55%,更新渲染快133%内存减少54% 源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking 新的特性 1. Composition API(组合API) setupref与reactivecomput…

AI与就业:技术革命下的职业转型与挑战

内容概要 在当今时代,人工智能的迅猛发展正在深刻影响着我们的就业市场。这一技术革命不仅让我们看到了未来的职业转型,还引发了对于新兴技能需求的深思。随着AI技术的普及,许多传统行业面临着巨大的变革压力,同时也为新兴领域创…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考:Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程(建议收藏)_androidstudio-CSDN博客 想下旧版本的android_studio的地址(仅供参考&#xf…

Uubntu下的Boost库安装及使用

一、Boost库介绍 Boost库是为C语言标准库提供扩展的一些C程序库的总称。 Boost库由Boost社区组织开发、维护。其目的是为C程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C标准库共同工作,并且为其提供扩展功能。Boost库使用Boost License来授权使用&…

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计(MLE) 二、最大后验估计(MAP) 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时,MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频: 贝叶斯解释“L1和L2正则化”&#xff…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

数据结构与算法——Java实现 54.力扣1008题——前序遍历构造二叉搜索树

不要谩骂以前的自己 他当时一个人站在雾里也很迷茫 ​​​​​​​ ​​​​​​​ ​​​​​​​—— 24.11.6 1008. 前序遍历构造二叉搜索树 给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。 保证 对于给定…

【Leecode】Leecode刷题之路第46天之全排列

题目出处 46-全排列-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 46-全排列-官方解法 预备知识 回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解…

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日,由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能,探索制造业数字化转型之路。 在苏州站活动开场,达索系统专业客户事业部华东区渠道经理马腾飞…

CatLIP,加速2.7倍!采用分类损失的CLIP水准的预训练视觉编码器

CatLIP,加速2.7倍!采用分类损失的CLIP水准的预训练视觉编码器 FesianXu 20241018 at Wechat Search Team 前言 传统的CLIP采用对比学习的方式进行预训练,通常需要汇聚多张节点的多张设备的特征向量以进行打分矩阵的计算,训练速度…

linux笔记(selinux)

一、概述 定义SELinux(Security - Enhanced Linux)是一种基于 Linux 内核的强制访问控制(MAC)安全机制。它为 Linux 系统提供了更细粒度的安全策略,增强了系统的安全性。目的主要目的是限制进程对系统资源(…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行,另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口,对某些接口加密的参数进行逆向破解,从而修改请求…

Scala 中 set 的实战应用 :图书管理系统

1. 创建书籍集合 首先,我们创建一个可变的书籍集合,用于存储图书馆中的书籍信息。在Scala中,mutable.Set可以用来创建一个可变的集合。 val books mutable.Set("朝花惜拾", "活着") 2. 添加书籍 我们可以使用操作符…

简单介绍一下mvvm mvc mvp以及区别、历史

MVC(Model - View - Controller) 因MVC架构的灵活性,架构图形式很多,仅供参考 历史: MVC 是最早出现的软件架构模式之一,其历史可以追溯到 20 世纪 70 年代,最初被用于 Smalltalk - 80 环境。…

“高级Java编程复习指南:深入理解并发编程、JVM优化与分布式系统架构“

我的个人主页 接下来我将方享四道由易到难的编程题,进入我们的JavaSE复习之旅。 1:大小写转换------题目链接 解题思路: 在ASCII码表中,⼤写字⺟A-Z的Ascii码值为65- 90,⼩写字⺟a-z的Ascii码值为97-122。每个字 ⺟…

设备租借系统(源码+文档+部署+讲解)

本文将深入解析“设备租借系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 本项目名称为设备租借系统,是对企业内部设备进行信息化管理的系统,可以实现设备的借用、归还、状态跟踪等功能&#xff…

使用 PageHelper 在 Spring Boot 项目中实现分页查询

目录 前言1. 项目环境配置1.1 添加 PageHelper 依赖1.2 数据库和 MyBatis 配置 2. 统一的分页响应类3. 使用 PageHelper 实现分页查询3.1 Service 层分页查询实现3.2 PageHelper 分页注意事项 4. 控制层调用示例5. 常见问题与解决方案5.1 java.util.ArrayList cannot be cast t…

【C++】C++移动语义、左值右值、左值引用右值引用、移动构造函数、std::move、移动赋值操作符

二十五、C移动语义、左值和右值、左值引用右值引用、移动构造函数、std::move、移动赋值操作符 本部分讨论一些更高级的C特性:C移动语义。但是讲移动语义之前我们得先了解什么左值右值、左值引用和右值引用。 1、C的左值和右值、左值引用和右值引用左值是有地址的…

【国内中间件厂商排名及四大中间件对比分析】

国内中间件厂商排名 随着新兴技术的涌入,一批国产中间件厂商破土而出,并在短时间内迅速发展,我国中间件市场迎来洗牌,根据市占率,当前我国中间件厂商排名依次为:东方通、宝兰德、中创股份、金蝶天燕、普元…