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

Python 代码性能分析:从cProfile到line_profiler

Python 代码性能分析从cProfile到line_profiler核心结论cProfilePython 内置的性能分析工具适合整体性能分析line_profiler第三方工具提供逐行性能分析memory_profiler内存使用分析工具py-spy低开销的采样分析器性能对比不同工具适用于不同场景需根据具体需求选择一、性能分析基础1.1 性能分析的重要性识别瓶颈找出代码中的性能瓶颈优化决策基于数据做出优化决策验证优化效果量化优化前后的性能差异资源利用了解内存和CPU使用情况1.2 性能分析的类型时间分析分析代码执行时间内存分析分析内存使用情况CPU分析分析CPU使用情况I/O分析分析I/O操作性能二、cProfile 详解2.1 基本原理基于统计使用统计方法收集函数调用信息低开销对程序运行影响较小内置工具Python 标准库的一部分调用图生成函数调用关系图2.2 使用方法命令行使用python -m cProfile script.py程序内使用通过cProfile.Profile()类结果分析使用pstats模块分析结果2.3 代码示例import cProfile import pstats import time def slow_function(): 慢速函数 time.sleep(1) result 0 for i in range(1000000): result i return result def fast_function(): 快速函数 time.sleep(0.5) result sum(range(1000000)) return result def main(): 主函数 print(开始执行慢速函数) slow_function() print(开始执行快速函数) fast_function() print(执行完成) # 方法1命令行方式 # python -m cProfile -o profile.out performance_analysis.py # 方法2程序内使用 if __name__ __main__: # 创建分析器 profiler cProfile.Profile() profiler.enable() # 执行代码 main() # 停止分析 profiler.disable() # 分析结果 stats pstats.Stats(profiler) stats.sort_stats(cumulative) # 按累计时间排序 stats.print_stats(10) # 打印前10个函数 # 保存结果 stats.dump_stats(profile.out)2.4 结果分析ncalls函数调用次数tottime函数本身执行时间percall每次调用的平均时间cumtime函数及其子函数的累计时间filename:lineno(function)函数所在文件和行号三、line_profiler 详解3.1 基本原理逐行分析提供函数内逐行的执行时间分析装饰器使用profile装饰器标记需要分析的函数高精度提供更详细的性能分析信息可视化支持生成可视化报告3.2 安装与使用安装pip install line_profiler使用在函数上添加profile装饰器然后使用kernprof命令运行分析使用line_profiler分析结果文件3.3 代码示例# performance_analysis.py profile def slow_function(): 慢速函数 time.sleep(1) result 0 for i in range(1000000): result i return result profile def fast_function(): 快速函数 time.sleep(0.5) result sum(range(1000000)) return result def main(): 主函数 print(开始执行慢速函数) slow_function() print(开始执行快速函数) fast_function() print(执行完成) if __name__ __main__: main()3.4 运行与分析# 运行并生成分析文件 kernprof -l -v performance_analysis.py # 或者生成分析文件后再分析 kernprof -l performance_analysis.py python -m line_profiler performance_analysis.py.lprof四、其他性能分析工具4.1 memory_profiler内存分析分析代码的内存使用情况安装pip install memory_profiler使用使用profile装饰器标记函数运行python -m memory_profiler script.py4.2 py-spy采样分析低开销的采样分析器安装pip install py-spy使用py-spy record -o profile.svg -- python script.py特点可以分析正在运行的进程4.3 profilehooks装饰器提供更方便的装饰器接口安装pip install profilehooks使用profilehooks.profile装饰器4.4 代码示例# memory_profiler 示例 from memory_profiler import profile import time profile def memory_intensive_function(): 内存密集型函数 data [] for i in range(1000000): data.append(i) time.sleep(0.5) del data time.sleep(0.5) return 完成 def main(): memory_intensive_function() if __name__ __main__: main()五、性能对比实验5.1 不同工具性能开销对比import time import cProfile from memory_profiler import profile # 测试函数 def test_function(): result 0 for i in range(1000000): result i return result # 测试不同分析工具的开销 def test_profiler_overhead(): # 原始执行时间 start time.time() test_function() original_time time.time() - start print(f原始执行时间: {original_time:.4f} 秒) # cProfile 开销 profiler cProfile.Profile() start time.time() profiler.enable() test_function() profiler.disable() cprofile_time time.time() - start print(fcProfile 执行时间: {cprofile_time:.4f} 秒) print(fcProfile 开销: {(cprofile_time - original_time) / original_time * 100:.2f}%) # memory_profiler 开销 profile def decorated_test(): return test_function() start time.time() decorated_test() memory_profiler_time time.time() - start print(fmemory_profiler 执行时间: {memory_profiler_time:.4f} 秒) print(fmemory_profiler 开销: {(memory_profiler_time - original_time) / original_time * 100:.2f}%) if __name__ __main__: test_profiler_overhead()5.2 实际案例分析import cProfile import pstats import time # 模拟实际业务逻辑 def process_data(data): 处理数据 # 模拟数据处理 time.sleep(0.1) result [] for item in data: result.append(item * 2) return result def filter_data(data): 过滤数据 # 模拟过滤 time.sleep(0.05) result [item for item in data if item 5] return result def analyze_data(data): 分析数据 # 模拟分析 time.sleep(0.15) result sum(data) average result / len(data) if data else 0 return average def main(): 主函数 # 生成数据 data list(range(1000)) # 处理数据 processed process_data(data) # 过滤数据 filtered filter_data(processed) # 分析数据 average analyze_data(filtered) print(f数据平均值: {average}) if __name__ __main__: # 性能分析 profiler cProfile.Profile() profiler.enable() main() profiler.disable() # 分析结果 stats pstats.Stats(profiler) stats.sort_stats(cumulative) stats.print_stats()5.3 实验结果分析分析工具开销详细程度适用场景cProfile低函数级整体性能分析line_profiler中行级函数内部优化memory_profiler高行级内存使用分析py-spy低函数级生产环境分析六、最佳实践建议6.1 性能分析策略从整体到局部先使用 cProfile 找到性能瓶颈再使用 line_profiler 分析具体函数关注热点函数重点分析占用时间最多的函数对比优化效果优化前后使用相同的分析工具进行对比结合多种工具根据需要结合使用不同的分析工具6.2 代码优化技巧算法优化选择更高效的算法和数据结构减少循环使用列表推导式、生成器等代替显式循环缓存计算结果使用 lru_cache 等缓存装饰器并行处理对于CPU密集型任务使用 multiprocessingI/O优化使用异步I/O或批量操作6.3 性能分析工具选择快速分析使用 cProfile详细分析使用 line_profiler内存分析使用 memory_profiler生产环境使用 py-spy实时分析使用 py-spy 的实时模式6.4 代码示例优化前后对比import cProfile import time # 优化前 def slow_fibonacci(n): 慢速斐波那契函数 if n 1: return n return slow_fibonacci(n-1) slow_fibonacci(n-2) # 优化后 from functools import lru_cache lru_cache(maxsizeNone) def fast_fibonacci(n): 快速斐波那契函数 if n 1: return n return fast_fibonacci(n-1) fast_fibonacci(n-2) # 测试 def test_fibonacci(): print(测试慢速斐波那契) start time.time() result slow_fibonacci(35) print(f结果: {result}, 时间: {time.time() - start:.4f} 秒) print(\n测试快速斐波那契) start time.time() result fast_fibonacci(35) print(f结果: {result}, 时间: {time.time() - start:.4f} 秒) if __name__ __main__: # 性能分析 profiler cProfile.Profile() profiler.enable() test_fibonacci() profiler.disable() # 分析结果 import pstats stats pstats.Stats(profiler) stats.sort_stats(cumulative) stats.print_stats(10)七、总结Python 提供了多种性能分析工具每种工具都有其特点和适用场景cProfile内置工具低开销适合整体性能分析line_profiler逐行分析详细度高适合函数内部优化memory_profiler内存分析适合内存优化py-spy低开销采样适合生产环境分析技术演进的内在逻辑从简单的函数级分析到逐行分析从时间分析到内存分析性能分析工具的发展反映了对代码性能优化的不断深入。这些工具共同构成了 Python 性能优化的完整生态。在实际应用中应根据具体需求选择合适的性能分析工具结合代码优化技巧不断提升代码性能。性能分析是一个持续的过程需要在开发和维护过程中定期进行以确保代码的高效运行。

相关文章:

Python 代码性能分析:从cProfile到line_profiler

Python 代码性能分析:从cProfile到line_profiler 核心结论 cProfile:Python 内置的性能分析工具,适合整体性能分析line_profiler:第三方工具,提供逐行性能分析memory_profiler:内存使用分析工具py-spy&…...

CSS如何实现移动端文字转阴影效果_通过text-stroke模拟描边

-webkit-text-stroke 是真正的文字描边属性,支持颜色与粗细,渲染干净但仅 WebKit/Blink 内核支持,需用 text-shadow 降级;应使用 em 单位、避免 px、确保对比度≥4.5:1。text-stroke 不是阴影,但能“假装”描边用 text…...

Java 从入门到精通(十六):线程通信与 wait()/notify(),为什么有些线程不是抢锁,而是在“等条件”?

Java 从入门到精通(十六):线程通信与 wait()/notify(),为什么有些线程不是抢锁,而是在“等条件”? 前一篇我们把线程同步这件事先讲透了:为什么多个线程一起改共享变量,结果会乱什么…...

day25-数据结构力扣

134. 加油站 题目链接134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 思路 虽然这个题看起来有点抽象 但是你仔细看一下他的示例&#xff0c;其实能明白 设每一站的净油量&#xff1a;diff[i] gas[i] - cost[i] 总判断如果所有 diff 加起来 < 0 → 总油不够跑一…...

【会议征稿通知 | 华东交通大学主办 | IEEE出版 | EI 、Scopus稳定检索】第二届智慧综合能源系统工程国际学术会议(IIESE 2026)

第二届智慧综合能源系统工程国际学术会议&#xff08;IIESE 2026&#xff09; 2026 2nd International Conference on Intelligent Integrated Energy Systems Engineering 2026年5月15-17日 | 中国南昌 会议官网&#xff1a;www.iiese.net 截稿时间&#xff1a;见官网&…...

【会议征稿通知 | 广州计算机学会主办 | IEEE出版 | EI 、Scopus稳定检索】

2026年信息安全&#xff0c;隐私保护与人工智能国际学术会议&#xff08;ISPPAI 2026&#xff09; 2026 International Conference on Information Security, Privacy Protection and Artificial Intelligence&#xff08;ISPPAI 2026&#xff09; 2026年5月15-17日 | 中国-广…...

3步实现网页到Figma设计的高效转换:HTML转Figma工具实战指南

3步实现网页到Figma设计的高效转换&#xff1a;HTML转Figma工具实战指南 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 在当今的Web开发与设计工作流中&#xff0c;设计师与开发…...

CXPatcher:智能升级CrossOver依赖,一键提升游戏兼容性的高效工具

CXPatcher&#xff1a;智能升级CrossOver依赖&#xff0c;一键提升游戏兼容性的高效工具 【免费下载链接】CXPatcher A patcher to upgrade Crossover dependencies and improve compatibility 项目地址: https://gitcode.com/gh_mirrors/cx/CXPatcher 你是否曾经为Cros…...

OpenWrt在VMWare中的安装与配置全攻略

1. 为什么要在VMWare中运行OpenWrt&#xff1f; 很多刚接触软路由的朋友可能都会有这个疑问&#xff1a;为什么要在虚拟机里折腾OpenWrt&#xff1f;直接买个路由器刷机不香吗&#xff1f;其实这里面大有讲究。我最早接触OpenWrt就是在VMWare里&#xff0c;当时纯粹是为了测试一…...

Quartus II 13.0入门指南:VHDL仿真全流程解析

1. Quartus II 13.0初体验&#xff1a;从安装到第一个VHDL项目 第一次打开Quartus II 13.0时&#xff0c;那个深蓝色界面可能会让你有点懵。别担心&#xff0c;我刚开始用的时候也这样&#xff0c;现在让我带你一步步走完整个流程。首先确保你的电脑满足这些基本配置&#xff1…...

无人机框架市场最新数据:规模达16.95亿元,产业配套加速成型

据恒州诚思调研统计&#xff0c;2025年全球无人机框架市场规模约16.95亿元&#xff0c;预计未来将持续保持平稳增长态势&#xff0c;到2032年市场规模将接近25.29亿元&#xff0c;未来六年复合年均增长率&#xff08;CAGR&#xff09;为5.9%。在无人机产业蓬勃发展的当下&#…...

遗传算法与免疫算法求解物流配送中心选址问题,附详细注释与源码(Matlab编写

遗传算法 求解物流配送中心选址问题 源码详细注释(Matlab编写) 有两种解决选址问题代码&#xff0c;说明如下&#xff1a; 代码一&#xff1a;免疫算法物流配送中心选址 模型应用场景&#xff1a; 1.配送中心能够配送的总量≥各揽收站需求之和 2.一个配送中心可为多个揽收站配送…...

基于二阶锥规划的Cplex配电网重构多时段动态最优潮流研究及实践应用

cplex配电网重构多时段&#xff0c;二阶锥规划 参考文献名&#xff1a;主动配电网最优潮流研究及其应用实例&#xff08;中国电机工程学报&#xff09; 最优潮流研究在配电网规划运行中不可或缺 &#xff0c;且在大量分布式能源接入的主动配电网环境下尤 为重要 。 传统 的启发…...

Python面试必备:30道高频笔试题深度解析与实战演练

1. Python基础概念高频考点解析 Python作为一门解释型语言&#xff0c;其基础概念是面试官最喜欢考察的"试金石"。我在面试新人时发现&#xff0c;超过60%的候选人会在基础题上栽跟头。让我们先看几个典型问题&#xff1a; 列表与元组的本质区别 不只是可变性这么简单…...

[具身智能-372]:具身智能大脑、小脑、肢体各自的功能分工、各自的技术栈、各自的难点

具身智能的“大脑-小脑-肢体”架构是工程界借鉴人类神经运动系统提出的分层解耦设计范式。该架构并非严格生物学复刻&#xff0c;而是为了在复杂系统中实现“认知-控制-执行”的模块化管理与协同优化。以下从功能分工、技术栈与核心难点三个维度进行系统拆解&#xff1a;&#…...

【ROS2实战笔记-4】Gazebo:从通信桥接到性能瓶颈相关技术梳理

Gazebo是ROS2生态中应用最广泛的仿真环境&#xff0c;但多数开发者只用到了它的基础功能。这篇文章不谈怎么添加传感器、怎么写URDF&#xff0c;而是聊一些在使用Gazebo过程中容易被忽略的技术细节——那些理解了能省下大量调试时间、不理解会反复踩坑的事情。一、通信桥接&…...

【ROS2实战笔记-3】RViz2图形底层与调试暗坑

RViz2是ROS2生态中使用频率最高的工具之一&#xff0c;每天都有大量开发者打开它、添加Display、调整视角&#xff0c;然后开始调试算法。但很少有人真正关心它的图形架构、渲染瓶颈&#xff0c;以及那些隐藏在配置文件里的行为逻辑。这篇文章不打算讲怎么添加一个Image Displa…...

OpenHarmony开发必备:巧用DevEco Studio的PCID导入,快速搞定新设备适配

OpenHarmony设备适配实战&#xff1a;PCID导入与SysCap深度解析 当拿到一台全新的智能车载中控或智能家居面板时&#xff0c;开发者常会遇到这样的困境&#xff1a;设备厂商提供的SDK文档晦涩难懂&#xff0c;而项目工期又迫在眉睫。上周我就遇到某车企定制车机的适配需求&…...

从视频到词语:基于Yolov5与3DResNet-GRU的端到端唇语识别实战

1. 唇语识别技术入门&#xff1a;为什么选择Yolov53DResNet-GRU组合&#xff1f; 想象一下这样的场景&#xff1a;你在嘈杂的酒吧里&#xff0c;朋友对你说了句话但完全听不清。这时候你可能会下意识地盯着对方的嘴唇&#xff0c;试图通过嘴型变化理解意思。这就是人类天然的&q…...

古瑞瓦特光伏逆变器资料大解析:8-10KW与5-8KW型号电路图及程序应用概览

光伏逆变器资料 8-10KW 5-8KW古瑞瓦特光伏逆变器电 路图、光伏逆变器资料 古瑞瓦特的5&#xff0d;10KW资料逆变器带程序光伏逆变器资料 8-10KW 5-8KW古瑞瓦特光伏逆变器电 路图、光伏逆变器资料 古瑞瓦特的5&#xff0d;10KW资料逆变器带程序 古瑞瓦特逆变器资料,古瑞瓦特光并…...

非科班生如何用Trae IDE在数学建模比赛中逆袭?Python实战经验分享

非科班生如何用Trae IDE在数学建模比赛中逆袭&#xff1f;Python实战经验分享 数学建模比赛向来是跨学科竞技的舞台&#xff0c;但编程这道门槛让不少非计算机专业的学生望而却步。去年带队参加统计建模大赛时&#xff0c;我们三个经管专业的大一新生就面临这样的困境——团队里…...

从玩具车到真车:阿克曼模型在ROS与自动驾驶仿真中的配置避坑指南

从玩具车到真车&#xff1a;阿克曼模型在ROS与自动驾驶仿真中的配置避坑指南 当你第一次在Gazebo里加载那辆精致的仿真车模型时&#xff0c;满心期待它能在虚拟世界里优雅地转弯&#xff0c;结果却发现它要么像醉汉一样走S形路线&#xff0c;要么干脆表演原地陀螺——恭喜你&am…...

医学图像处理(三)ABIDE数据集实战:从下载到预处理流程解析

1. ABIDE数据集&#xff1a;自闭症脑成像研究的金钥匙 第一次接触ABIDE数据集时&#xff0c;我正为一个自闭症儿童脑功能连接项目犯愁。这个由纽约大学医学院牵头、全球17个研究中心共同构建的宝藏&#xff0c;包含了1112名受试者&#xff08;539名自闭症患者573名正常对照&…...

SecGPT-14B入门教程:网络安全工程师必学的14B专用大模型调用与结果解读方法

SecGPT-14B入门教程&#xff1a;网络安全工程师必学的14B专用大模型调用与结果解读方法 1. 引言 如果你是网络安全工程师、渗透测试人员&#xff0c;或者对安全分析感兴趣&#xff0c;那你一定遇到过这样的场景&#xff1a;面对海量的日志&#xff0c;需要快速定位攻击线索&a…...

TL431实战指南:从基础参数到精密稳压电路设计

1. TL431到底是什么&#xff1f;为什么工程师都爱用它&#xff1f; 第一次接触TL431时&#xff0c;我也被这个三脚小东西搞懵了。它长得像普通三极管&#xff0c;但 datasheet 上写的却是"可编程精密稳压源"。简单来说&#xff0c;TL431就是个会"自动调节"…...

Cursor Pro终极破解教程:免费解锁AI编程助手完整指南

Cursor Pro终极破解教程&#xff1a;免费解锁AI编程助手完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tria…...

Ostrakon-VL-8B效果展示:多图对比自动标注卫生差异点并生成整改清单

Ostrakon-VL-8B效果展示&#xff1a;多图对比自动标注卫生差异点并生成整改清单 1. 引言&#xff1a;当AI成为你的“卫生巡检员” 想象一下这个场景&#xff1a;你是一家连锁餐饮或零售企业的区域经理&#xff0c;手下管理着十几家门店。每周&#xff0c;你都需要花大量时间翻…...

Ubuntu 20.04下编译Ceres 2.2.0,手把手解决CUDA路径和依赖问题

Ubuntu 20.04下Ceres 2.2.0编译实战&#xff1a;从CUDA路径配置到依赖问题全解析 在机器人SLAM、三维重建和计算机视觉领域&#xff0c;Ceres Solver作为非线性优化库的标杆工具&#xff0c;其GPU加速能力直接影响大规模优化问题的求解效率。本文将带您深入解决Ubuntu 20.04环境…...

ESPript 3.0实战指南:从多序列比到出版级可视化

1. ESPript 3.0入门&#xff1a;为什么科研人员离不开它 第一次接触ESPript是在读博期间&#xff0c;当时导师指着文献里一张色彩斑斓的多序列比对图说&#xff1a;"这种专业图表就是用ESPript做的"。作为生物信息学领域的"老牌神器"&#xff0c;ESPript 3…...

Ubuntu 22.04蓝牙开关秒关?别慌,用dmesg揪出Intel固件缺失的元凶

Ubuntu 22.04蓝牙故障排查指南&#xff1a;从日志分析到固件修复 当你兴冲冲地想在Ubuntu 22.04上连接蓝牙耳机&#xff0c;却发现开关像被施了魔法一样秒关&#xff0c;这种挫败感我太熟悉了。作为一名长期与Linux硬件问题斗智斗勇的老兵&#xff0c;我发现这类问题往往不是系…...