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): 这部分显示了函数所在的文件名、行号以及函数名称,便于定位代码位置。

结合上面内容,解释一下输出的信息:

  1. 总共进行了10004次输出,共执行了0.041秒
  2. 按照累计时间排序
  3. {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方法调用,通常用于执行字符串形式的代码块。
  4. < string >:1(< module >)
    同样被调用1次,直接时间和累计时间均为0.041秒,表明这是顶级代码块的执行,可能是脚本的入口点。
  5. 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函数。
  6. {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函数调用。
  7. {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)

在这里插入图片描述
两个函数是类似的,所以输出报告这里就不多说了,参考上一份报告,读取这一份报告的信息。

结尾

性能测试的模块就学习了这两个,这个模块的报告稍微复杂难看点,需要花时间去理解学习。

作业

  1. 使用cProfile模块测试自己编写的代码,并读取报告信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core 的 winform 的 浏览器控件 WebView2

在.NET Core WinForms应用程序中&#xff0c;没有直接的“浏览器控件”&#xff0c;因为WinForms不支持像WebBrowser控件那样的功能。但是&#xff0c;你可以使用WebView2控件&#xff0c;它是一个基于Chromium的浏览器内核&#xff0c;可以在WinForms应用程序中嵌入Web内容。 …

R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性

原文链接&#xff1a;使用ggplot绘制柱状图&#xff0c;在柱子中显示数值和显著性 本期教程 获得本期教程示例数据&#xff0c;后台回复关键词&#xff1a;20240628。&#xff08;PS&#xff1a;在社群中&#xff0c;可获得往期和未来教程所有数据和代码&#xff09; 往期教程…

搭建ASPP:多尺度信息提取网络

文章目录 介绍代码实现 介绍 ASPP&#xff08;Atrous Spatial Pyramid Pooling&#xff09;&#xff0c;空洞空间卷积池化金字塔。简单理解就是个至尊版池化层&#xff0c;其目的与普通的池化层一致&#xff0c;尽可能地去提取特征。ASPP 的结构如下&#xff1a; 如图所示&…

十二、Yocto集成ROS2 app程序(package)

文章目录 Yocto集成ROS2 app程序1. 添加一个ros2 package应用程序2. 添加bb文件集成app应用程序 Yocto集成ROS2 app程序 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十二篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi…

GuLi商城-前端启动命令npm run dev

由于这里配置了dev&#xff0c;所以启动命令是npm run dev

柯桥在职学历提升|专科本科之自考本科哪些专业不考数学

一、管理类专业 这类专业综合性和理论性比较强&#xff0c;除了涉及到管理学相关的理论知识外&#xff0c;还有相应的专业知识&#xff0c;目前比较典型的专业有&#xff1a;行政管理、人力资源管理、工商管理&#xff08;现代企业管理&#xff09;、工商管理&#xff08;商务管…

高通410-linux棒子设置网络驱动

1.首先打开设备管理器 2.看到其他设备下的RNDIS&#xff0c;右键更新驱动程序 3.点击浏览我的电脑… 最后一个

Linux操作系统--软件包管理(保姆级教程)

RPM软件包的管理 大多数linux的发行版本都是某种打包系统。软件包可以用来发布应用软件&#xff0c;有时还可以发布配置文件。他们比传统结构的.tar和.gz存档文件有几个优势。如它们能让安装过程尽可能成为不可分割的原子操作。 软件包的安装程序会备份它们改动过的文件。如果…

2024-6-28 石群电路-32

2024-6-28&#xff0c;星期五&#xff0c;20:05&#xff0c;天气&#xff1a;雨&#xff0c;心情&#xff1a;晴。今天没有什么事情发生&#xff0c;继续学习&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1. 对称三相电路的计算&#xff08…

6.24.4.2 YOLO- logo:一种基于变压器的YOLO分割模型,用于数字乳房x光片中乳腺肿块的检测和分割

背景与目的:数字化乳房x光片的肿块检测和分割在乳腺癌的早期发现和治疗中起着至关重要的作用。此外&#xff0c;临床经验表明&#xff0c;它们是乳腺病变病理分类的上游任务。深度学习的最新进展使分析更快、更准确。本研究旨在开发一种用于乳房x线摄影的乳腺癌质量检测和分割的…

MySQL事物

事务的概念 ●事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体 一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 ●事务是一个不可分割的工作逻辑单元&#…

深度学习经典检测方法概述

一、深度学习经典检测方法 two-stage&#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 one-stage&#xff08;单阶段&#xff09;&#xff1a;YOLO系列 1. one-stage 最核心的优势&#xff1a;速度非常快&#xff0c;适合做实时检测任务&#xff01; 但是…

定制化、精细化、场景化AI训练数据趋于基础数据服务市场主流

算法、算力和数据共同构成了AI产业链技术发展的三大核心要素。在人工智能行业发展进程中&#xff0c;有监督的深度学习算法是推动人工智能技术取得突破性发展的关键技术理论&#xff0c;而大量训练数据的支撑则是有监督的深度学习算法实现的基础。算法模型从技术理论到应用实践…

ISSCC论文详解2024 34.2——双端口设计实现高面积利用的浮点/整数存算

本文将要介绍的文献主题为浮点存内计算&#xff0c;题目为《A 16nm 96Kb Integer/Floating-Point Dual-Mode-Gain-CellComputing-in-Memory Macro Achieving 73.3-163.3TOPS/W and 33.2-91.2TFLOPS/W for AI-Edge Devices》&#xff0c;下面本文将从文章基本信息与背景知识、创…

基于Jmeter的分布式压测环境搭建及简单压测实践

写在前面 平时在使用Jmeter做压力测试的过程中&#xff0c;由于单机的并发能力有限&#xff0c;所以常常无法满足压力测试的需求。因此&#xff0c;Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例&#xff0…

仿迪恩城市门户分类信息网discuz模板

Discuz x3.3模板 仿迪恩城市门户分类信息网 (GBK) Discuz模板 仿迪恩城市门户分类信息网(GBK)

【深度学习】卷积神经网络CNN

李宏毅深度学习笔记 图像分类 图像可以描述为三维张量&#xff08;张量可以想成维度大于 2 的矩阵&#xff09;。一张图像是一个三维的张量&#xff0c;其中一维代表图像的宽&#xff0c;另外一维代表图像的高&#xff0c;还有一维代表图像的通道&#xff08;channel&#xff…

怎样查看vsphere client 的登录日志

- 问题摘要&#xff1a; 怎样查看vsphere client 的登录日志 - 解决方案/工作方法 1.登录vsphere client > vc > Monitor > Tasks and Events > Events, 查看日志 2. 查看VC 的websso.log日志 /var/log/vmware/sso/websso.log 3. 可以把websso.log文件拿到本地电…

前端Web开发HTML5+CSS3+移动web视频教程 Day1 HTML 第一天

链接 HTML 介绍 HTML&#xff1a;HyperText Markup Language&#xff0c;超文本标记语言&#xff0c;是一种用于创建网页的标准标记语言。 HTML 运行在浏览器上&#xff0c;由浏览器来解析。 对于中文网页需要使用 <meta charset"utf-8"> 声明编码&#xf…

多图示例:如何呈现论文结果中的各种图表

本文根据《Journal of the American College of Cardiology》上曾发表的一篇文章《Making Sense of Statistics in Clinical Trial Reports》&#xff0c;来全面而具体地说明临床试验论文中&#xff0c;各种类型数据与结果使用图表的正确展示方法。 本文将着重介绍基线数据、试…