Python学习笔记26:进阶篇(十五)常见标准库使用之性能测试cProfile模块学习使用
前言
本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。
根据模块知识,一次讲解单个或者多个模块的内容。
教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html
本文主要记录性能测试cProfile模块的知识。
cProfile
cProfile是Python标准库中的一个性能分析模块,用于程序代码的性能剖析,帮助开发者找出程序中的瓶颈,以便进行优化。它提供了对程序运行时的函数调用次数、总时间、自耗时间等统计信息。
主要特点:
非侵入性:cProfile可以在不修改代码的情况下对程序进行性能分析。
精度高:相比于Python自带的timeit模块,cProfile能提供更详细的函数级性能数据。
输出格式灵活:结果可以输出到命令行、文件或进一步处理。
常用函数
cProfile.run
cProfile.run(statement, filename=None, sort=-1)
- statement: 要分析的代码字符串,可以是函数名、表达式等。
- filename: 可选参数,如果提供,则将分析结果保存到该文件中,而不是打印到控制台。
- sort: 排序方式,决定输出结果的顺序。默认为-1,表示按累计时间降序排列。其他选项有’cumulative’、‘time’、'calls’等。
import cProfiledef test_func():# 示例函数,进行一些操作for i in range(10000):if i % 2 == 0:print("偶数")else:print("奇数")# 上述代码将分析test_func的执行情况,按照累计时间降序排列输出结果。
cProfile.run('test_func()', sort='cumulative')

这里介绍一下函数输出结构:
- ncalls: 表示函数被调用的次数。如果是递归函数,这个数字会包括所有层级的调用。
- tottime: 函数执行所消耗的总时间,不包含其调用的子函数所消耗的时间。单位通常是秒。
- percall: 平均每次调用该函数所花费的时间(tottime除以ncalls)。
- cumtime: 函数及其内部调用的所有子函数所消耗的总时间。这是一个“累计”时间,反映了调用该函数对整体运行时间的贡献。
- percall (cumulative): 累计时间的平均值,即每次调用该函数及其子函数的平均总耗时。
- filename:lineno(function): 这部分显示了函数所在的文件名、行号以及函数名称,便于定位代码位置。
结合上面内容,解释一下输出的信息:
- 总共进行了10004次输出,共执行了0.041秒
- 按照累计时间排序
- {built-in method builtins.exec}
ncalls: 1次调用
tottime: 0.000秒,直接执行时间几乎为零
percall: 0.000秒,平均每次调用的直接时间
cumtime: 0.041秒,包括子函数在内的总执行时间
percall (cumulative): 0.041秒,累计时间的平均值
location: {built-in method builtins.exec},表示这是一个内置的exec方法调用,通常用于执行字符串形式的代码块。 - < string >:1(< module >)
同样被调用1次,直接时间和累计时间均为0.041秒,表明这是顶级代码块的执行,可能是脚本的入口点。 - part_two.py:4(test_func)
ncalls: 1次调用
tottime: 0.002秒,函数test_func直接执行耗时
percall: 0.002秒,test_func每次调用的直接时间
cumtime: 0.041秒,包括内部调用的总时间,与上一行相同,意味着这个函数或是其内部调用占了大部分时间
percall (cumulative): 0.041秒,累计时间的平均值
location: part_two.py:4(test_func),表明这是来自part_two.py文件第4行的test_func函数。 - {built-in method builtins.print}
ncalls: 10000次调用
tottime: 0.039秒,直接执行时间总和
percall: 0.000秒,平均每次调用的直接时间非常短,表明单次打印操作非常快
cumtime: 0.039秒,累计时间也是0.039秒,因为这里是直接调用,没有子函数影响
percall (cumulative): 同样是0.000秒
location: {built-in method builtins.print},表示这是内置的print函数调用。 - {method ‘disable’ of ‘_lsprof.Profiler’ objects}
ncalls, tottime, percall, cumtime, percall (cumulative) 全部为0,表示这是关闭Profiler的调用,几乎不占用时间
location: {method ‘disable’ of ‘_lsprof.Profiler’ objects},指的是关闭cProfile Profiler的方法调用。
从这份报告中可以看出,test_func函数及其内部操作(可能包括调用print)是导致程序执行时间较长的主要原因,而直接执行print函数虽然被调用了大量次数,但由于单次执行效率高,对总执行时间的贡献相对较小。
非常枯燥的报告,但是要习惯并且耐心看。
cProfile.runctx
与cProfile.run函数类似,但允许更精细地控制执行环境。
cProfile.runctx(statement, globals, locals, filename=None, sort=-1)
- statement: 要分析的代码字符串,可以是函数名、表达式等。
- filename: 可选参数,如果提供,则将分析结果保存到该文件中,而不是打印到控制台。
- sort: 排序方式,决定输出结果的顺序。默认为-1,表示按累计时间降序排列。其他选项有’cumulative’、‘time’、'calls’等。
- globals: 传递给代码执行的全局变量字典。
- locals: 传递给代码执行的局部变量字典。
def profiled_func(x):return x * xglobals_dict = {'profiled_func': profiled_func}
locals_dict = {'x': 10}cProfile.runctx('profiled_func(x)', globals_dict, locals_dict)

两个函数是类似的,所以输出报告这里就不多说了,参考上一份报告,读取这一份报告的信息。
结尾
性能测试的模块就学习了这两个,这个模块的报告稍微复杂难看点,需要花时间去理解学习。
作业
- 使用
cProfile模块测试自己编写的代码,并读取报告信息。
相关文章:
Python学习笔记26:进阶篇(十五)常见标准库使用之性能测试cProfile模块学习使用
前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 本文主要…...
python中类的继承详解
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展 (1)在类的继承中,存在父类跟子类,子类可以继…...
社交风潮塑造者:探索用户在Facebook的影响力
在当今数字化社会中,Facebook不仅是人们社交互动的主要平台,更是塑造社交风潮和文化趋势的重要力量。本文将从另一个角度深入探讨用户在Facebook上的影响力,探索其如何通过个人行为和互动,影响和改变社会的各个方面。 个人表达和内…...
Kotlin设计模式:代理模式详解
Kotlin设计模式:代理模式详解 在软件开发中,设计模式是解决常见问题的一种优雅方法。本文将介绍Kotlin中的代理模式(Proxy Pattern),其应用场景,以及如何通过实例代码实现这一模式。 代理模式的目的 代理…...
PostgreSQL逻辑备份-pg_dump
1.pg_dump备份恢复 pg_dump 是一个逻辑备份工具。使用 pg_dump 可以在数据库处于使用状态下进行一致 性的备份, 它不会阻塞其他用户对数据库的访问 。 一致性备份是 pg_dump 开始运行时,给数据库打了一个快照,且在 pg_dump 运行过程 中发生…...
UG_NX11.0之Windows11中安装出错及解决方法
UG_NX11.0之Windows11中安装出错及解决方法 文章目录 UG_NX11.0之Windows11中安装出错及解决方法1. 安装出错2. 解决方法1. 设置以兼容性模式运行2. 配置环境变量 3. 再次安装问题解决4. 安装后可删除配置的环境变量(可选) 1. 安装出错 以管理员身份运行Launch.exe,如下 点击D…...
android view 设置过 transalationY/X 后 marginTop/marginStart/Left 不变
在 Android 开发中,当你对一个视图(View)设置了 translationY 属性后,这个视图的 marginTop 属性实际上并不会改变。这是因为 translationY 只会影响视图的绘制位置,而不会改变视图的布局参数。换句话说,translationY 是一个运行时…...
解释在Android中如何实现本地存储,包括SQLite数据库和SharedPreferences。
在Android开发中,本地存储是不可或缺的一部分,它允许应用程序在用户的设备上保存和检索数据。两种常见的本地存储方式是SQLite数据库和SharedPreferences。下面我将从技术难点、面试官关注点、回答吸引力和代码举例四个方面来详细解释如何在Android中实现…...
鸿蒙开发 之 健康App案例
1.项目介绍 该项目是记录用户日常饮食情况,以及针对不同食物摄入营养不同会有对应的营养摄入情况和日常运动消耗情况,用户可以自己添加食品以及对应的热量。 1.1登陆页 1.2饮食统计页 1.3 食物列表页 2.登陆页 2.1自定义弹框 import preferences from oh…...
umi3项目axios 请求参数序列化参数
由于get 请求中有一个日期参数 dates 是一个数组类型。 未处理参数时请求地址是这样的:/api/list?page1&pageSize10&keyWord&dates[]2024-06-10&dates[]2024-06-24 会发现dates后面有中括号,所以前端需要将参数格式处理变成如下:/api…...
js实现数据去重合并
应用场景,一个list,包含已经选择的数据和未选择的数据,新增数据到已选择的数据中。 要考虑到二次选择的数据和已经选择的数据有重复的可能,所以,第一步先从二次选择的数据中进行去重,然后再将两个list进行数…...
[ios逆向]查看ios安装包ipa签名证书embedded.mobileprovision解密 附带解密环境openssl
openssl smime -inform der -verify -noverify -in embedded.mobileprovision 解密embedded.mobileprovision文件 链接:https://pan.baidu.com/s/1UwNOWONKV1SNj5aX_ZZCzQ?pwdglco 提取码:glco –来自百度网盘超级会员V8的分享 可以使用everything 查看…...
tr、cut、split、grep -E
目录 tr命令:替换和删除 cut命令:快速裁剪 split命令:文件拆分 文件合并 面试题 1.现在有一个日志文件,有5个G,能不能快速的打开 2.cat合并和paste合并之间的区别? 3.统计当前主机的连接状态&#…...
《分析模式》漫谈08-单继承不是“唯一继承”
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》第2章这一段: 划线处的single inheritance,2004中译本的翻译: 翻译为“单继承”,是正确的。 2020中译本的翻译:…...
c++字典
在C中,“字典”通常指的是std::map或std::unordered_map,它们是标准库中提供的关联容器,用于存储键值对。以下是一些常见的操作示例,包括插入、访问、删除和遍历元素。 使用 std::map std::map 是一种有序的关联容器,键…...
rga_mm: RGA_MMU unsupported Memory larger than 4G!解决
目录 报错完整log如下:解决方案:报错完整log如下: [ 3668.824164] rga_mm: RGA_MMU unsupported Memory larger than 4G! [ 3668.824305] rga_mm: scheduler core[4] unsupported mm_flag[0x0]! [ 3668.824320] rga_mm: rga_mm_map_buffer map dma_buf err...
构建个人文件上传服务:Python Flask实现上传和下载完整指南
介绍 在本教程中,我们将学习如何使用Python Flask框架将文件上传到服务器,并使用SQLite数据库来跟踪上传的文件。我们将提供后端代码和一个示例项目的Git链接,以便您可以轻松地跟随本教程。 准备工作 首先,您需要安装Python和F…...
瓦罗兰特新赛季更新资讯 瓦罗兰特新赛季免费加速器
瓦罗兰特新赛季来喽,这是一款由拳头开发的免费第一人称射击游戏,游戏凭借其独特的玩法和丰富的英雄选择吸引了大量玩家。 我们可以在游戏中选择自己喜欢的角色出场与敌人进行对战,而且每一个角色都有自己独特的道具以及技能,使用好…...
希尔排序的实现
引言 排序在我们生活中十分常见,无论是购物软件中的商品推荐还是名次、排名都与排序算法息息相关。希尔排序是排序中较快的一种,而希尔排序实现的基础是插入排序。 排序的实现 插入排序(以升序为例) 插入排序的原理是从第二个数…...
使用Python selenium爬虫领英数据,并进行AI岗位数据挖掘
随着OpenAI大火,从事AI开发的人趋之若鹜,这次使用Python selenium抓取了领英上几万条岗位薪资数据,并使用Pandas、matplotlib、seaborn等库进行可视化探索分析。 但领英设置了一些反爬措施,对IP进行限制封禁,因此会用到…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
