大家好,我是正在实战各种 AI 项目的程序员晚枫。
先测量再优化!用工具找到真正的性能瓶颈,而不是靠猜测。这一讲,教会你科学的性能分析方法。
📖 开篇:不要猜测,要测量
1 | # 常见的错误优化: |
🔍 cProfile(最常用的分析器)
基本用法
1 | import cProfile |
输出解读
1 | 1999993 function calls in 1.234s |
| 列名 | 含义 |
|---|---|
| ncalls | 调用次数 |
| tottime | 函数自身执行时间(不含子调用) |
| cumtime | 累计时间(含子调用) |
| filename:lineno | 代码位置 |
热点分析
1 | # 找出最慢的函数 |
🎯 line_profiler(行级分析)
1 | pip install lineprofiler |
1 | # test.py |
1 | kernprof -l -v test.py |
1 | Timer unit: 1e-06 s |
⚡ perf(Linux 内核性能分析器)
1 | # Linux 系统用 perf |
perf 可以分析 CPU 缓存命中率、分支预测失误等底层信息。
🧠 常见优化技巧
技巧1:使用局部变量
1 | # 慢 |
技巧2:列表推导式 > 循环
1 | # 慢 |
技巧3:使用 slots
1 | # 无 __slots__ |
技巧4:使用内置函数
1 | # 慢:手写循环 |
技巧5:使用生成器
1 | # 慢:一次性生成列表 |
📊 timeit(精确计时)
1 | import timeit |
🔬 memory_profiler(内存分析)
1 | pip install memory_profiler |
1 | # 添加装饰器 |
1 | python -m memory_profiler test.py |
💡 本节作业
- 用 cProfile 分析一个自己的 Python 程序,找出热点
- 用 line_profiler 找出循环中最慢的行
- 尝试用 timeit 对比列表推导式和 map() 的性能
🎯 本讲总结
cProfile:最常用的性能分析器,按 cumulative/tottime/ncalls 排序。
line_profiler:行级分析,精确定位到每一行。
优化技巧:局部变量、列表推导式、__slots__、内置函数、生成器。
timeit:精确计时,测量小代码片段的性能。
memory_profiler:内存分析,找出内存消耗大户。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 | 《流畅的 Python(第 2 版)》 | 《CPython 设计与实现》
🔗 课程导航
← 上一讲:C 扩展编程 | 下一讲:CPython 贡献指南 →
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询