Python 3.15 profiling.sampling 怎样选择 wall 和 cpu 模式
Python 3.15 的 profiling.sampling(Tachyon)同时提供 wall-clock 和 CPU 两种采样模式。遇到“接口变慢”或“计算变重”时,先按问题边界选模式:包含网络、磁盘等待和阻塞时间,用 wall;只想看主动消耗 CPU 的部分,用 cpu。两者都是统计采样,不是精确的函数计时器。
官方地址:https://docs.python.org/3.15/library/profiling.sampling.html
一句话判断:业务总耗时异常先看 wall,确认计算热点再看 cpu;如果问题是精确调用次数或微小差异,改用 tracing 或 timeit。
先看懂 wall 和 cpu 记录的时间边界
wall-clock 记录的是经过了多少现实时间,所以等待 I/O、锁竞争、网络响应或阻塞调用时,调用栈仍可能出现在采样结果里。cpu 模式只关注线程主动执行 CPU 的时间,更适合回答“代码到底把处理器花在哪里”。
这也是为什么两种模式不能简单互换:一个接口的 wall 结果很高,可能是数据库或网络等待;切到 cpu 后占比下降,反而说明瓶颈在外部等待而不是 Python 计算。采样结果由样本次数估算,短函数可能刚好没有被采到。

用最小命令把两种模式分开
先用默认 wall 模式观察完整的经过时间。下面的示例是命令写法,评论说明了参数目的;这里不把示例输出当成真实运行证据。
# wall 模式包含 I/O 等待,适合先找整体耗时来源 python -m profiling.sampling run --mode wall -d 30 --flamegraph -o wall-profile.html app.py # cpu 模式只聚焦主动计算,适合确认 Python 计算热点 python -m profiling.sampling run --mode cpu -d 30 --pstats app.py
run 适合从脚本启动时开始观察;如果进程已经在运行,则用 attach 连接 PID。生产排障通常先选较短的观察窗口,再根据样本量决定是否延长,而不是一开始就把采样率调到很高。
# 连接已有进程,wall 先看真实请求期间的总耗时 python -m profiling.sampling attach --mode wall -d 30 12345 # 同一个进程再看 cpu,比较主动计算与等待的差异 python -m profiling.sampling attach --mode cpu -d 30 --pstats 12345
如果需要函数级表格,选 pstats;想快速查看调用层次,可选 flamegraph。输出格式改变的是阅读方式,不会把统计采样变成精确计时。
按问题信号选择入口和输出
可以把选择压缩成三类。第一类是接口、任务或服务“总耗时变长”,先使用 wall,因为 I/O 和阻塞本身就是用户等待时间的一部分。第二类是 wall 很高但怀疑 Python 计算过重,再用 cpu 排除等待,把注意力集中到 CPU 热点。第三类是已经知道生产进程的 PID,需要在不改代码的情况下观察,则从 attach 开始。
如果要同时观察线程池中的线程,可以加入 --all-threads;如果要分析异步任务的栈,则根据目标选择 --async-aware。这些参数扩大观察范围,但不改变 wall 与 cpu 的定义。

| 现象 | 优先模式 | 原因 |
|---|---|---|
| 接口等待网络、磁盘或锁 | wall | 保留现实经过时间中的等待部分 |
| 纯计算占用 CPU | cpu | 排除 I/O 等待后看主动计算热点 |
| 生产进程已有 PID | attach | 从现有进程开始采样,不要求改代码或重启 |
| 需要精确调用次数 | tracing | 采样只能估算频率,不能给出完整调用计数 |
采样结果怎样复查才不容易误判
第一,观察时间太短时,样本数量不足,结果会有较大波动;可以延长持续时间,或者让短脚本重复运行以获得更多样本。第二,生产分析要用具有代表性的负载,峰值流量和空闲流量都可能把结论带偏。第三,profiling 工具与被连接的目标进程需要使用同一个 Python 小版本,不能用 Python 3.14 的分析器连接 Python 3.15 进程。
最后记住三条边界:wall 是用户视角的耗时线索,cpu 是处理器视角的热点线索,tracing 或 timeit 才适合精确调用和微基准问题。先用 wall 定位大方向,再用 cpu 缩小计算范围,通常比只盯一份百分比更稳妥。
相关问题
wall 模式很高是不是 Python 代码慢?不一定,网络、磁盘、锁和外部服务等待都会抬高 wall;需要用 cpu 做对照。
cpu 模式能代替 timeit 吗?不能。cpu 是运行期间的统计采样,适合找热点;比较几微秒级差异时,应使用 timeit。
为什么两次采样的百分比不完全一样?采样是统计估计,样本数量、负载和线程调度都会造成小幅波动,应关注稳定的热点形状。
总结来说,wall 和 cpu 的选择取决于你要解释的是“用户等了多久”还是“处理器算了多久”。先明确边界,再组合 run 或 attach 与合适的输出格式,最后用持续时间、负载和 Python 小版本复查结论。
Java 线程池队列过长怎样设置背压
- 上一篇
- Java 线程池队列过长怎样设置背压
- 下一篇
- Python 3.15 延迟导入怎样评估启动收益
-
- 文章 · python教程 | 40分钟前 |
- Python Fraction 近似浮点数时怎样控制最大分母
- 417浏览 收藏
-
- 文章 · python教程 | 55分钟前 |
- Python compression.zstd 怎样读取大压缩流
- 288浏览 收藏
-
- 文章 · python教程 | 57分钟前 |
- Python 3.15 t-string 怎样用于模板化文本
- 491浏览 收藏
-
- 文章 · python教程 | 59分钟前 | 连接池 · python ·
- Python httpx 怎样复用异步客户端连接
- 299浏览 收藏
-
- 文章 · python教程 | 1小时前 | SQLite · Python教程 · 内存数据库 serialize Python sqlite3 deserialize SQLite迁移
- Python sqlite3 serialize 与 deserialize 的内存数据库迁移方法
- 497浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python logging 怎样用 contextvars 注入请求标识
- 471浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python typing.Protocol 怎样描述可替换依赖
- 236浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python multiprocessing 怎样选择 spawn 和 fork
- 322浏览 收藏
-
- 文章 · python教程 | 1小时前 | JSON · Python教程 · Python JSON enum 反序列化 序列化 json.dumps json.loads StrEnum
- Python StrEnum 怎样与 JSON 字符串互转
- 393浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python 3.15 延迟导入怎样评估启动收益
- 133浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 471次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 530次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 549次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 499次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 317次使用
-
- Python sqlite3 Connection serialize 怎么导出数据库快照:备份窗口、内存占用与恢复校验
- 2026-08-26 501浏览
-
- Python监控网页状态:requests异常处理实战
- 2026-05-29 501浏览
-
- TensorFlow模型部署为API的TF Serving方法
- 2026-05-26 501浏览
-
- Python字符串编码转换:encode与decode详解
- 2026-05-16 501浏览
-
- TensorFlow裁剪无用算子方法详解
- 2026-05-15 501浏览
