最省事方式是用cprofile.run("func()")传字符串执行,自动统计并按cumtime倒序输出;需注意必须加括号调用、支持filename存文件,但无法区分i/o与cpu耗时。

直接用 cProfile.run() 快速定位耗时函数
最省事的方式是把要分析的代码包进字符串,丢给 cProfile.run()。它会自动统计每行执行次数、总耗时、单次平均耗时,最后按累计时间倒序打出报告。
常见错误是只传函数名不加调用括号,比如写成 cProfile.run(my_func) —— 这会报 TypeError: expected string or code object;必须传字符串:cProfile.run("my_func()"),或者用 exec 包裹的完整可执行语句。
- 适合临时调试:一行命令启动,不用改原逻辑
- 注意路径问题:如果函数在模块里,得先
import再调用,比如cProfile.run("from mymodule import work; work()") - 输出默认打到 stdout,想存文件用
cProfile.run("...", filename="profile.out")
用 Profile 对象 + pstats 精细筛选热点
硬编码字符串太糙,尤其要反复跑、比对、过滤时。更稳的做法是创建 cProfile.Profile 实例,手动 enable()/disable(),再用 pstats.Stats 加载分析。
关键点在于:原始 profile 数据(.prof 文件)本身不可读,pstats 是唯一标准解析器;直接打开 .prof 文件看到的全是二进制乱码,别试。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 启用 profiling:
pr = cProfile.Profile(); pr.enable(),放在目标代码前 - 停用并保存:
pr.disable(); pr.dump_stats("output.prof") - 加载分析:
stats = pstats.Stats("output.prof"),之后可用stats.sort_stats("cumulative").print_stats(10)查前 10 个累计耗时最高的函数 - 常用过滤:
stats.filter("mymodule.py")或stats.print_stats("requests|http")(正则匹配函数名/文件名)
避免被 time.sleep() 或 I/O 操作干扰真实 CPU 瓶颈
cProfile 统计的是“挂钟时间”(wall-clock time),不是纯 CPU 时间。如果你的函数里有 time.sleep(5)、requests.get() 或文件读写,这些等待时间全算进去了,容易误判“这个函数很慢”,其实只是在等外部响应。
这时候得结合 line_profiler(需 pip install)看逐行 CPU 时间,或者用 psutil 监控进程实际 CPU 占用率来交叉验证。
-
cProfile报告里tottime是函数内部纯执行时间(不含子调用),cumtime是含所有子调用的总耗时 —— 优先盯cumtime找顶层入口 - 数据库查询慢?
cProfile只能告诉你cursor.execute()耗时高,但看不出是 SQL 本身低效还是网络延迟,得配合 DB 日志或 EXPLAIN - 异步代码(async/await)用
cProfile会失真,因为事件循环调度不体现为函数调用栈,此时该用py-spy
导出火焰图看调用链路更直观
文本报告里嵌套深的调用链(比如 A → B → C → D → requests.post)靠眼睛数缩进太累。flameprof 或 py-spy 可把 .prof 转成交互式火焰图,宽度=耗时,纵向堆叠=调用层级。
步骤很简单:先生成 output.prof,再终端运行 flameprof output.prof > profile.svg,用浏览器打开 SVG 就能看到哪条路径最宽、哪个函数在中间“卡住”了整条链。
- 注意:火焰图显示的是采样数据,不是精确计时,但对识别长尾调用和意外递归极其有效
- 如果
flameprof报No module named 'pstats',说明 Python 版本太新(3.12+),换用py-spy record -o profile.svg --pid $PID更稳 - Web 服务类程序建议用
--pid方式 attach 进程,避免重启服务丢失现场
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










