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

Python10天突击--Day 3:函数式编程突破

以下是 Python 中实现方法耗时统计装饰器的完整方案,包含同步/异步支持、多级嵌套调用统计、可视化输出和性能分析等高级功能:


基础版:同步方法计时装饰器

import time
from functools import wrapsdef timeit(func):"""基础版:同步方法计时装饰器"""@wraps(func)def wrapper(*args, **kwargs):start_time = time.perf_counter()result = func(*args, **kwargs)elapsed = (time.perf_counter() - start_time) * 1000  # 毫秒print(f"⏱️ {func.__module__}.{func.__name__} 耗时: {elapsed:.2f}ms")return resultreturn wrapper# 使用示例
@timeit
def calculate_sum(n):return sum(range(n+1))calculate_sum(1_000_000)  # 输出: ⏱️ __main__.calculate_sum 耗时: 32.45ms

增强版:支持异步方法

import time
import asyncio
from functools import wraps
from typing import Callable, Uniondef benchmark(func: Callable):"""增强版:自动识别同步/异步方法"""@wraps(func)async def async_wrapper(*args, **kwargs):start_time = time.perf_counter()result = await func(*args, **kwargs)elapsed = (time.perf_counter() - start_time) * 1000print(f"⏱️ [ASYNC] {func.__name__} 耗时: {elapsed:.2f}ms")return result@wraps(func)def sync_wrapper(*args, **kwargs):start_time = time.perf_counter()result = func(*args, **kwargs)elapsed = (time.perf_counter() - start_time) * 1000print(f"⏱️ [SYNC] {func.__name__} 耗时: {elapsed:.2f}ms")return resultreturn async_wrapper if asyncio.iscoroutinefunction(func) else sync_wrapper# 使用示例
@benchmark
async def async_task():await asyncio.sleep(1)@benchmark
def sync_task():time.sleep(0.5)asyncio.run(async_task())  # 输出: ⏱️ [ASYNC] async_task 耗时: 1000.12ms
sync_task()               # 输出: ⏱️ [SYNC] sync_task 耗时: 500.34ms

专业版:带调用层级分析

import time
import inspect
from functools import wrapsclass TimeProfiler:"""专业版:带调用层级和可视化统计"""_current_level = -1@classmethoddef measure(cls, prefix: str = ""):def decorator(func):@wraps(func)def wrapper(*args, **kwargs):cls._current_level += 1indent = "│   " * cls._current_levelstart_time = time.perf_counter()result = func(*args, **kwargs)elapsed = (time.perf_counter() - start_time) * 1000caller = inspect.stack()[1].functionprint(f"{indent}└─ {prefix}[{caller}{func.__name__}] 耗时: {elapsed:.2f}ms")cls._current_level -= 1return resultreturn wrapperreturn decorator# 使用示例
class DataProcessor:@TimeProfiler.measure(prefix="📊 ")def process(self):self._load_data()self._clean_data()return self._analyze()@TimeProfiler.measure()def _load_data(self):time.sleep(0.1)@TimeProfiler.measure()def _clean_data(self):time.sleep(0.2)@TimeProfiler.measure()def _analyze(self):time.sleep(0.3)DataProcessor().process()

输出示例

│   └─ 📊 [<module> → process] 耗时: 600.45ms
│   │   └─ [_load_data] 耗时: 100.12ms
│   │   └─ [_clean_data] 耗时: 200.23ms
│   │   └─ [_analyze] 耗时: 300.10ms

生产级:集成日志系统

import time
import logging
from functools import wraps
from contextlib import contextmanagerlogging.basicConfig(level=logging.INFO)
logger = logging.getLogger('performance')@contextmanager
def time_measure(identifier: str):"""生产级:带日志记录和阈值告警"""start_time = time.perf_counter()try:yieldfinally:elapsed = (time.perf_counter() - start_time) * 1000msg = f"{identifier} 耗时: {elapsed:.2f}ms"if elapsed > 500:  # 慢方法警告阈值logger.warning(f"🚨 {msg} (超过500ms)")else:logger.info(msg)def logged_timeit(scope: str = ""):def decorator(func):@wraps(func)def wrapper(*args, **kwargs):with time_measure(f"{scope}.{func.__name__}"):return func(*args, **kwargs)return wrapperreturn decorator# 使用示例
@logged_timeit(scope="data_service")
def fetch_from_database():time.sleep(0.6)  # 模拟慢查询fetch_from_database()
# 日志输出: WARNING:performance:🚨 data_service.fetch_from_database 耗时: 600.15ms (超过500ms)

高级特性扩展

1. 参数感知统计
def benchmark_with_args(func):@wraps(func)def wrapper(*args, **kwargs):arg_str = ", ".join([str(arg) for arg in args[:3]])start_time = time.perf_counter()result = func(*args, **kwargs)elapsed = (time.perf_counter() - start_time) * 1000print(f"⏱️ {func.__name__}({arg_str}...) 耗时: {elapsed:.2f}ms")return resultreturn wrapper
2. 性能分析集成
import cProfiledef profile_deco(func):"""集成cProfile性能分析"""@wraps(func)def wrapper(*args, **kwargs):profiler = cProfile.Profile()result = profiler.runcall(func, *args, **kwargs)profiler.print_stats(sort='cumulative')return resultreturn wrapper
3. 统计结果聚合
from collections import defaultdictstats = defaultdict(list)def aggregated_timeit(func):@wraps(func)def wrapper(*args, **kwargs):start_time = time.perf_counter()result = func(*args, **kwargs)elapsed = (time.perf_counter() - start_time) * 1000stats[func.__name__].append(elapsed)return resultreturn wrapper# 调用后可通过 stats 查看所有方法的耗时统计

方案对比表

特性基础版增强版专业版生产级
同步方法支持
异步方法支持
调用层级可视化
日志系统集成
性能阈值告警
适合生产环境

最佳实践建议

  1. 开发调试:使用专业版获得详细调用树
  2. 生产环境:使用生产级集成到日志系统
  3. 性能优化:结合profile_deco进行热点分析
  4. 注意事项
    • 避免在装饰器内进行耗时操作
    • 高频调用方法慎用(可采样统计)
    • 分布式系统需结合TraceID实现全链路追踪

根据实际需求选择合适的装饰器实现,小型项目用基础版即可,复杂系统推荐生产级方案。

相关文章:

Python10天突击--Day 3:函数式编程突破

以下是 Python 中实现方法耗时统计装饰器的完整方案&#xff0c;包含同步/异步支持、多级嵌套调用统计、可视化输出和性能分析等高级功能&#xff1a; 基础版&#xff1a;同步方法计时装饰器 import time from functools import wrapsdef timeit(func):"""基础…...

Datawhale 入驻 GitCode:以开源力量推动 AI 教育公平与创新

在 AI 技术深度重塑教育生态的今天&#xff0c;国内首个 AI 开源学习社区 —— Datawhale 正式加入 GitCode 开源平台&#xff01;作为覆盖全球 3000 高校、培养超百万 AI 人才的创新社区&#xff0c;Datawhale 将通过开源协作模式&#xff0c;为人工智能教育公平注入新动能&a…...

ChatDBA:一个基于AI的智能数据库助手

今天给大家介绍一个基于 AI 大语言模型实现数据库故障诊断的智能助手&#xff1a;ChatDBA。 ChatDBA 是由上海爱可生信息技术股份有限公司开发&#xff0c;通过对话交互&#xff0c;提供数据库故障诊断、专业知识学习、SQL 生成和优化等功能&#xff0c;旨在提升 DBA 工作效率。…...

MacOS中的鼠标、触控板的设置研究

一、背景和写这篇文章的原因 想搞清楚和配置好鼠标&#xff0c;比如解决好为什么我的滚动那么难用&#xff1f;怎么设置滚轮的方向跟windows相同&#xff1f;调整双击速度&#xff0c;调整鼠标滚轮左右拨动的"冷却时间"。 二、各种设置之详细解释 1. MacOS设置 -&…...

asp.net core 项目发布到 IIS 服务器

目录 一、VS2022 发布 二、设置IIS服务 三、配置IIS管理器 &#xff08;一&#xff09;打开IIS管理器 &#xff08;二&#xff09;添加站台 &#xff08;三&#xff09;配置应用程式集区 四、安装ASP.NET Core Hosting Bundle 五、设定IIS的日志位置 六、测试 一、VS2…...

如何解决线程安全问题(不涉及分布式情况)

线程安全问题本质 当多个线程并发操作共享资源&#xff08;变量/对象&#xff09;时&#xff0c;可能因非原子性操作或内存可见性问题导致数据不一致。 解决方案一&#xff1a;synchronized 关键字 ‌实现方式&#xff1a;‌ ‌实例方法同步锁‌ 在实现Runnable接口的自定义线…...

Spring Boot(二十二):RedisTemplate的List类型操作

RedisTemplate和StringRedisTemplate的系列文章详见&#xff1a; Spring Boot&#xff08;十七&#xff09;&#xff1a;集成和使用Redis Spring Boot&#xff08;十八&#xff09;&#xff1a;RedisTemplate和StringRedisTemplate Spring Boot&#xff08;十九&#xff09;…...

【Nodebb系列】Nodebb笔记写入方案

NodeBB写入方案 前言 最近在整理以前记录的碎片笔记&#xff0c;想把它们汇总到NodeBB中&#xff0c;方便管理和浏览。但是笔记内容有点多&#xff0c;并且用发帖的形式写到NodeBB中会丢失时间信息&#xff0c;因此整理了一套NodeBB写入方案&#xff0c;大致流程如下&#xf…...

计算机视觉——基于YOLOV8 的人体姿态估计训练与推理

概述 自 Ultralytics 发布 YOLOV5 之后&#xff0c;YOLO 的应用方向和使用方式变得更加多样化且简单易用。从图像分类、目标检测、图像分割、目标跟踪到关键点检测&#xff0c;YOLO 几乎涵盖了计算机视觉的各个领域&#xff0c;似乎已经成为计算机视觉领域的“万能工具”。 Y…...

鸿蒙小案例---心情日记

效果演示 代码实现 import { router, window } from kit.ArkUIEntry Component struct Index {async aboutToAppear(): Promise<void> {let w await window.getLastWindow(getContext())w.setWindowSystemBarProperties({statusBarColor: #00C6C3,statusBarContentColo…...

力扣第206场周赛

周赛链接&#xff1a;竞赛 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台​​​​​​ 1. 二进制矩阵中的特殊位置 给定一个 m x n 的二进制矩阵 mat&#xff0c;返回矩阵 mat 中特殊位置的数量。 如果位置 (i, j) 满足 mat[i][j] 1 并且行 i 与列 j 中…...

从 SYN Flood 到 XSS:常见网络攻击类型、区别及防御要点

常见的网络攻击类型 SYN Flood、DoS&#xff08;Denial of Service&#xff09; 和 DDoS&#xff08;Distributed Denial of Service&#xff09; 是常见的网络攻击类型&#xff0c;它们的目标都是使目标系统无法正常提供服务。以下是它们的详细说明&#xff1a; 1. SYN Flood…...

el-tree 实现树形菜单子级取消选中后父级选中效果不变

背景 在复杂的企业级管理系统中,树形菜单是一种常见的数据展示和交互组件。传统的树形菜单通常存在以下交互局限: 子节点取消选中时,父节点会自动取消选中无法满足复杂的权限分配和数据筛选场景实际应用场景: 组织架构权限管理多层级资源分配复杂的数据筛选与展示实现需求…...

Java虚拟机——JVM(Java Virtual Machine)解析一

1.JVM是什么&#xff1f; 1.1 JVM概念 Java Virtual Machine (JVM) 是JDK的核心组件之一&#xff0c;它使得 Java 程序能够在任何支持 JVM 的设备或操作系统上运行&#xff0c;而无需修改源代码 JDK是什么&#xff0c;JDK和JVM是什么关系&#xff1f;1.Java IDE(Integrated …...

开源的PMPI库实现及示例代码

开源的PMPI库实现及示例代码 PMPI (Profiling MPI) 是MPI标准中定义的接口&#xff0c;允许开发者通过拦截MPI调用进行性能测量和调试。以下是几个常用的开源PMPI库实现&#xff1a; 1. MPICH的PMPI接口 MPICH本身提供了PMPI接口&#xff0c;可以直接使用。 2. OpenMPI的PM…...

【源码】SpringMvc源码分析

文章目录 SpringMVC 基础回顾​核心组件源码分析​DispatcherServlet​HandlerMapping​HandlerAdapter​ViewResolver​ 请求处理流程源码解析​ 在当今的 Java Web 开发领域&#xff0c;SpringMVC 无疑是最为广泛应用的 Web 框架之一。它以其强大的功能、灵活的配置以及高度的…...

tcp特点+TCP的状态转换图+time_wait详解

tcp特点TCP的状态转换图time wait详解 目录 一、tcp特点解释 1.1 面向连接 1.1.1 连接建立——三次握手 1.1.2 连接释放——四次挥手 1.2 可靠的 1.2.1 应答确认 1.2.2 超时重传 1.2.3 乱序重排 1.2.4 去重 1.2.5 滑动窗口进行流量控制 1.3 流失服务&#xff08;字节…...

高支模自动化监测解决方案

1.行业现状 高大模板支撑系统在浇筑施工过程中&#xff0c;诸多重大安全风险点进行实时自动化安全监测的解决方案主要监测由于顶杆失稳、扣件失效、承压过大等引起的支撑轴力、模板沉降、相对位移、支撑体系倾斜等参数变化。系统采用无线自动组网、高频连续采样&#xff0c;实时…...

Node.js EventEmitter 深入解析

Node.js EventEmitter 深入解析 概述 Node.js 作为一种强大的 JavaScript 运行环境&#xff0c;以其异步、事件驱动特性在服务器端编程中占据了重要地位。EventEmitter 是 Node.js 中处理事件的一种机制&#xff0c;它允许对象&#xff08;称为“发射器”&#xff09;发出事件…...

OpenCV 图形API(24)图像滤波-----双边滤波函数bilateralFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用双边滤波到图像。 该函数对输入图像应用双边滤波&#xff0c;如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Fil…...

单双线程的理解 和 lua基础语法

1.什么是单进程 &#xff0c;什么是多进程 当一个程序开始运行时&#xff0c;它就是一个进程&#xff0c;进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由单个或多个线程所组成的。 1.1 像apache nginx 这类 服务器中间件就是多进程的软件 &#xff0…...

HarmonyOS中的多线程并发机制

目录 多线程并发1. 多线程并发概述2 多线程并发模型3 TaskPool简介4 Worker简介4.1 Woker注意事项4.2 Woker基本用法示例 5. TaskPool和Worker的对比5.1 实现特点对比5.2 适用场景对比 多线程并发 1. 多线程并发概述 并发模型是用来实现不同应用场景中并发任务的编程模型&…...

机器学习 | 强化学习方法分类汇总 | 概念向

文章目录 📚Model-Free RL vs Model-Based RL🐇核心定义🐇核心区别📚Policy-Based RL vs Value-Based RL🐇核心定义🐇 核心区别📚Monte-Carlo update vs Temporal-Difference update🐇核心定义🐇核心区别📚On-Policy vs Off-Policy🐇核心定义🐇核心区别…...

构件与中间件技术:概念、复用、分类及标准全解析

以下是对构件与中间件技术相关内容更详细的介绍&#xff1a; 一、构件与中间件技术的概念 1.构件技术 定义&#xff1a;构件是具有特定功能、可独立部署和替换的软件模块&#xff0c;它遵循一定的规范和接口标准&#xff0c;能够在不同的软件系统中被复用。构件技术就是以构…...

【随手笔记】QT避坑一(串口readyRead信号不产生)

问题描述&#xff1a; 使用QT5.15.2版本 测试串口readyRead绑定槽函数&#xff0c;接收到数据后 不能触发 试了很多网友的程序&#xff0c;他们的发布版本可以&#xff0c;但是源码我编译后就不能触发&#xff0c;判断不是代码的问题 看到有人提到QT版本的问题&#xff0c;于…...

基于 RabbitMQ 优先级队列的订阅推送服务详细设计方案

基于 RabbitMQ 优先级队列的订阅推送服务详细设计方案 一、架构设计 分层架构: 订阅管理层(Spring Boot)消息分发层(RabbitMQ Cluster)推送执行层(Spring Cloud Stream)数据存储层(Redis + MySQL)核心组件: +-------------------+ +-------------------+ …...

5.11 GitHub API调试五大高频坑:从JSON异常到异步阻塞的实战避坑指南

GitHub API调试五大高频坑:从JSON异常到异步阻塞的实战避坑指南 关键词:GitHub API 调试、JSON 解析异常、提示工程优化、异步任务阻塞、数据清洗策略 5.5 测试与调试:调试常见问题 问题1:GitHub API 调用异常 现象: requests.exceptions.HTTPError: 403 Client Error…...

反序列化漏洞介绍与挖掘指南

目录 反序列化漏洞介绍与挖掘指南 一、漏洞核心原理与危害 二、漏洞成因与常见场景 1. 漏洞根源 2. 高危场景 三、漏洞挖掘方法论 1. 静态分析 2. 动态测试 3. 利用链构造 四、防御与修复策略 1. 代码层防护 2. 架构优化 3. 运维实践 五、工具与资源推荐 总结 反…...

【产品】ToB产品需求分析

需求分析流程 合格产品经理 帮助用户、引导用户、分析需求、判断需求、设计方案 不能苛求用户提出合理、严谨的需求&#xff0c;这不是用户的责任和义务&#xff0c;而应该通过自己的专业能力来完成需求的采集工作 #mermaid-svg-ASu8vocank48X6FI {font-family:"trebuche…...

驱动开发硬核特训 · Day 10 (理论上篇):设备模型 ≈ 运行时的适配器机制

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 总线驱动模型实战全解析 敬请关注&#xff0c;记得标为原始粉丝。 在 Linux 驱动开发中&#xff0c;设备模型&#xff08;Device Model&#xff09;是理解驱动架构的核心。而从软件工程…...