当前位置:首页 > 文章列表 > 文章 > python教程 > Python pstats 怎样同时限制性能报告的排序和显示条目

Python pstats 怎样同时限制性能报告的排序和显示条目

来源:17golang原创 2026-10-29 18:29:07 0浏览 收藏

如果你已经拿到一份 profile 数据,却发现报告太长,通常不需要重新采集。pstats.Stats 把“按什么顺序看”和“显示多少条”拆成了两个动作:先用 sort_stats() 选择排序键,再用 print_stats() 传入数量、比例或函数名限制。两者可以直接链式调用。

官方地址:https://docs.python.org/3/library/pstats.html

最常用的写法是 pstats.Stats('profile.prof').sort_stats(SortKey.CUMULATIVE).print_stats(10):按累计耗时排序,再打印前 10 条。若还要按函数名筛选,就继续给 print_stats() 传限制参数。

排序和显示条目分别由谁控制

sort_stats() 决定报告表格的排序方式,print_stats() 决定这次输出保留哪些条目。不要把 print_stats(10) 理解成“重新计算前十名”;它只是从当前排序结果中限制输出。

pstats 统计对象连接排序选择和显示限制的静态结构说明图
图1:结构说明图,查看 pstats 的排序选择与报告限制分别落在哪个对象和方法上。

例如,想优先查看累计耗时最高的函数,可以这样写:

import pstats
from pstats import SortKey

# 读取已有的性能统计文件。
stats = pstats.Stats("profile.prof")

# 累计耗时决定排序,10 决定本次报告最多显示多少条。
stats.sort_stats(SortKey.CUMULATIVE).print_stats(10)

如果关心函数自身消耗的时间,把排序键换成 SortKey.TIME;如果需要多级排序,可以传入多个键,后面的键用于打破前面排序键相同的情况。

数量、比例和函数名可以怎样限制

print_stats() 的限制参数有三类:整数表示最多保留多少条,0 到 1 之间的浮点数表示保留数据集的一部分,字符串则按函数名做正则匹配。它们都只影响显示,不会改变 profile 文件本身。

from pstats import SortKey

# 先按自身耗时排序,再只显示前 10 条。
stats.sort_stats(SortKey.TIME).print_stats(10)

# 只查看排序结果中的前 10%,适合先观察整体热点。
stats.sort_stats(SortKey.CUMULATIVE).print_stats(0.1)

# 只显示函数名匹配 init 的条目;字符串按正则处理。
stats.sort_stats(SortKey.NAME).print_stats("init")

一个常见误区是把整数当成筛选条件。print_stats(10) 不是“找出所有调用次数等于 10 的函数”,而是把输出条数上限设为 10。

多个限制为什么要特别注意顺序

限制参数会按书写顺序依次应用。print_stats(0.1, "init") 表示先取当前排序结果的前 10%,再从这部分结果里匹配函数名;最后可能少于预期的条目。

pstats print_stats 多个限制按顺序收窄并复用调用关系报告的静态关系说明图
图2:关系说明图,查看数量、比例与函数名限制的组合边界。
from pstats import SortKey

# 先取前 10%,再匹配 init;这是两层限制,不保证得到 10 条。
stats.sort_stats(SortKey.CUMULATIVE).print_stats(0.1, "init")

# 如果目标是“匹配 init 的结果里再取前 10 条”,先写匹配条件。
stats.sort_stats(SortKey.CUMULATIVE).print_stats("init", 10)

这两个写法没有谁绝对正确,区别在于你的问题是“全局热点中的 init”还是“init 函数中的热点”。先确定筛选集合,再决定数量上限,通常更符合后者的阅读预期。

调用者和被调用者报告也能复用限制

确定热点条目后,还可以用 print_callers() 查看谁调用了它,或用 print_callees() 查看它调用了谁。这两个方法接受与 print_stats() 相同的限制参数,因此可以保持同一套排序和筛选思路。

from pstats import SortKey

# 只查看累计耗时最高的 5 个函数及其调用来源。
stats.sort_stats(SortKey.CUMULATIVE).print_callers(5)

# 对同一批限制后的条目,查看它们继续调用了哪些函数。
stats.sort_stats(SortKey.CUMULATIVE).print_callees(5)

需要记住的是,限制针对的是要展示的函数集合,而不是把原始统计数据永久删除。若要换一个视角,重新调用 sort_stats() 和对应的打印方法即可。

最后记住这三个判断

  • 想改变“谁排在前面”,调整 sort_stats() 的键。
  • 想改变“这次显示多少”,给 print_stats() 传整数、比例或函数名匹配。
  • 多个限制按从左到右依次收窄,顺序不同,结果集合也可能不同。

相关问题

为什么我传了 10,结果不足 10 条? 如果前面已经有比例或字符串限制,后续的 10 只是在剩余集合中取上限。

应该使用 CUMULATIVE 还是 TIME? 想看调用链整体耗时用 CUMULATIVE,只看函数自身耗时用 TIME,关键是先明确优化目标。

排序会修改 profile 文件吗? 不会。排序和限制只影响当前 Stats 对象的报告展示。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Python tokenize.detect_encoding 怎样识别源文件编码声明Python tokenize.detect_encoding 怎样识别源文件编码声明
上一篇
Python tokenize.detect_encoding 怎样识别源文件编码声明
Python profile 和 cProfile 的计时开销有什么区别
下一篇
Python profile 和 cProfile 的计时开销有什么区别
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    777次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    773次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    858次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    824次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    652次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码