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,一经查实,立即删除!

相关文章

【vuejs】首次页面加载时触发那些声明周期钩子函数

1. 首次页面加载触发的钩子 在Vue.js中&#xff0c;页面或组件的首次加载会触发一系列预定义的生命周期钩子函数&#xff0c;这些钩子函数按照特定的顺序执行&#xff0c;允许开发者在组件的不同阶段执行代码。以下是首次页面加载时触发的钩子及其作用&#xff1a; 2.1 befor…

.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; 如图所示&…

Nuxt框架 和 Vite框架比较(四)

共同点 基于 Vue.js&#xff1a;Nuxt 和 Vite 都是围绕 Vue.js 构建的&#xff0c;这意味着它们可以利用 Vue.js 的响应式数据绑定和组件系统。 现代前端开发&#xff1a;两者都支持现代前端开发实践&#xff0c;如组件化、模块化和单文件组件&#xff08;SFCs&#xff09;。 V…

十二、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…

【MotionCap】DROID-SLAM 1 :介绍及安装

DROID-SLAM :DROID-SLAM: Deep Visual SLAM for Monocular DROID-SLAM:适用于单目、立体和 RGB-D 相机的深度视觉 SLAM Stereo, and RGB-D Cameras https://arxiv.org/abs/2108.10869DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Camerasfile:///X:/04_mo…

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

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

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

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

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

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

Sentinel实现区分来源

要区分来源就要写代码实现RequestOriginParser接口 ,注意是要实现com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser 接口,别搞错接口了。 MyRequestOriginParser.java package com.codex.terry.sentinel.origin;import com.alibaba.csp.sentinel.ad…

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…

【面试题】网络 DNS协议(第二篇)

1.什么是DNS&#xff1f;它的作用是什么&#xff1f; DNS是一种将域名转换为IP地址的协议。 它的作用是通过将域名解析为相应的IP地址&#xff0c;使得用户可以更方便地访问互联网上的资源&#xff0c;而无需直接记住大量的IP地址。 2.DNS解析过程是怎样的&#xff1f; 客户端…

高性能、高可靠性!Kafka的技术优势与应用场景全解析

今天要和大家聊聊一个超级强大的消息系统——Kafka&#xff0c;从零开始&#xff0c;深入了解一下Kafka的优点和它的实际应用场景。 Kafka的优点 1. 高吞吐量 Kafka的高吞吐量表现堪称惊人。单机每秒处理几十上百万的消息量&#xff0c;即使存储了TB级别的消息&#xff0c;它…

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;下面本文将从文章基本信息与背景知识、创…