python中使用cProfile可视化并解决性能瓶颈问题

news2024/12/22 17:03:55

大家好,帕累托法则讲到:“在大多数情况下,80%的结果来自于20%的原因。”作为一名程序员,当代码运行速度不尽如人意时,就需要花费大量时间对代码进行相应的重构,但在许多情况下,所得到的速度提升并不值得花费的精力。

Python标准库已经提供了性能分析所需的工具,即cProfile。本文将展示如何使用cProfile,以可视化的方式快速识别代码中哪些部分计算开销最高,并且应该优先进行优化。

安装

cProfile是我们将用来测量代码的各个部分所需时间的工具,它是Python标准库的一部分,因此无需安装。QCachegrind将负责可视化cProfile的输出结果,将能够快速观察到性能瓶颈所在。对于MacOS用户,请检查是否已经安装了Homebrew。如果没有安装,请使用以下命令进行安装:

ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

然后可以安装QCachegrind:

brew install qcachegrind

对于其他操作系统的用户,推荐Pyprof2calltree工具。Pyprof2calltree将使用cProfile收集的分析数据转换为QCachegrind可以读取的格式,安装方法如下:

pip install pyprof2calltree

方法

完成安装后,进入包含Python脚本的文件夹,我们使用cProfile来测量脚本不同部分的运行时间,并将结果保存在一个名为medium_example.profile的文件中(可以选择使用任何名称,只要它是.profile文件):

python -m cProfile -o medium_example.profile 1_generate_ML_data.py

正如你所看到的,medium_example.profile文件已添加到文件夹中:

 该文件包含了运行脚本中所涉及的不同函数的运行时间。

现在,我们可以将cProfile的测量结果可视化:

pyprof2calltree -k -i medium_example.profile

 QCachegrind的用户界面包含了与所有相关函数的执行时间有关的信息:红色的是“Flat Profile”(左侧),蓝色的是“Callers”(右上方),绿色的是“Callees”(右下方)。

这个用户界面展示的内容较多。接下来本文会逐一解释所有这些内容的含义。

  • “Flat Profile” 面板出现在左侧,按时间消耗的降序排列提供了完整的函数调用列表。“Incl.” 列显示每个函数消耗的总时间,考虑到其被调用者花费的时间。

  • “Self” 列显示仅在函数本身内部花费的时间,不包括其被调用者花费的时间。

  • “Called” 列显示函数被调用的次数,而“Function” 列则显示函数的名称,包括其命名空间。

  • “Callers” 面板(右上方)显示调用所选函数的函数列表,以及在每个调用者函数中花费的时间。

  • 另一方面,“Callees” 面板(右下方)显示由所选函数调用的函数列表,以及每个被调用者函数中花费的时间。通过优化这些被调用者函数,你可以提高所选函数的性能。

现在你知道如何解读用户界面,接下来讲述如何使用它来找到性能瓶颈。

在“Flat Profile”面板的搜索栏中,输入builtins.exec,然后选择函数<Built-in method builtins.exec>。在“Callees”面板中,选择应该占用所有(~100%)的执行时间的第一个函数。它是你之前执行的脚本的入口点。

然后,该函数会被移到“Callers”面板上,并刷新“Callees”面板显示其中调用的函数。在本示例中,96.52%的执行时间来自函数generate_all_season_games_features

如果想再深入一级,可以选择该函数。它再次被移到“Callers”面板上,而“Callees”面板则显示了被调用的函数。42.73%的执行时间来自于generate_results_hometeam_current_season,而42.57%的执行时间来自于generate_resukts_awayteam_current_season

由于它们对速度的影响相同,我可以选择处理其中的任意一个函数。

优化 

建议从优化耗时最长的函数开始。所需的重构对代码来说将是非常具体的。以下是一些典型优化的示例:

  • 将嵌套的for循环转换为单个for循环。

  • 实现多进程。

  • 使用向量化。

当应用了第一个优化后,可以根据实际需要多次进行测量-可视化-优化周期,以达到符合要求的总运行时间。当涉及到优化代码时,遵循数据驱动的方法,能确保在不进行太多猜测和浪费时间的情况下,取得快速进展。 

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

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

相关文章

【Python入门系列】第十八篇:Python自然语言处理和文本挖掘

文章目录 前言一、Python常用的NLP和文本挖掘库二、Python自然语言处理和文本挖掘1、文本预处理和词频统计2、文本分类3、命名实体识别4、情感分析5、词性标注6、文本相似度计算 总结 前言 Python自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&…

吴恩达ChatGPT《LangChain Chat with Your Data》笔记

文章目录 1. Introduction2. Document Loading2.1 Retrieval Augmented Generation&#xff08;RAG&#xff09;2.2 Load PDFs2.3 Load YouTube2.4 Load URLs2.5 Load Notion 3. Document Splitting3.1 Splitter Flow3.2 Character Splitter3.3 Token Splitter3.4 Markdown Spl…

如何在3ds max中创建可用于真人场景的巨型机器人:第 3 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建腿部装备 步骤 1 打开 3ds Max。 打开在本教程最后一部分中保存的文件。 打开 3ds Max 步骤 2 转到创建> 系统并单击骨骼。 创建>系统 步骤 3 为的 侧视口中的腿&#xff0c;如下图所示…

【C++】开源:Linux端ALSA音频处理库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Linux端ALSA音频处理库。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…

12.(开发工具篇vscode+git)vscode 不能识别npm命令

1&#xff1a;vscode 不能识别npm命令 问题描述&#xff1a; 解决方式&#xff1a; &#xff08;1&#xff09;右击VSCode图标&#xff0c;选择以管理员身份运行&#xff1b; &#xff08;2&#xff09;在终端中执行get-ExecutionPolicy&#xff0c;显示Restricted&#xff…

vue2项目迁移到vue3中的改动——基础积累

最近在跟着大神学习vue3的内容&#xff0c;发现之前vue2写的代码可以直接照搬到vue3中&#xff0c;但是有一些需要改动的内容&#xff0c;下面做一下记录。 1.定义对象时&#xff0c;需要指定每个属性值 例如&#xff1a;listQuery:{} 如果使用&#xff1a;listQuery.Filter…

vue3+elementplus后台管理系统,实现侧边栏菜单显示到主内容区域

目录 1 创建页面2 设置路由3 修改首页4 首页的完整代码总结 我们已经使用vue3和elmentplus初步搭建了首页&#xff0c;上一篇中有个问题没解决&#xff0c;就是在侧边栏导航功能里&#xff0c;如果点击菜单希望是在首页打开页面而不是跳转到新页面。以下是我们希望实现的效果 这…

B/B+树算法

B树 基本概述 B树又称多路平衡搜索树。一棵m阶B树&#xff0c;要么是空树&#xff0c;要么满足以下特性&#xff1a; 每个节点最多有m棵子树根节点至少有两棵子树内部节点&#xff08;除根和叶子节点以外的节点&#xff09;至少有⌈m/2⌉棵子树关键字个数比子树个数少1终端节…

字符函数和字符串函数解析及模拟实现

字符函数和字符串函数解析及模拟实现 1. 求字符串长的函数1.1[strlen](https://legacy.cplusplus.com/reference/cstring/strlen/?kwstrlen)1.2 strlen()模拟实现 2. 长度不受限制的字符串函数2.1[strcpy](https://legacy.cplusplus.com/reference/cstring/strcpy/?kwstrcpy)…

数据结构与算法——什么是队列(队列存储结构)

队列&#xff0c;和栈一样&#xff0c;也是一种对数据的"存"和"取"有严格要求的线性存储结构。 与栈结构不同的是&#xff0c;队列的两端都"开口"&#xff0c;要求数据只能从一端进&#xff0c;从另一端出&#xff0c;如下图所示&#xff1a; 通…

vue中使用jsMind生成思维导图 截图功能踩坑

npm i jsmind先安装&#xff0c;再引入 import jsmind/style/jsmind.css import jsMind from jsmind/js/jsmind.js require(jsmind/js/jsmind.draggable.js) require(jsmind/js/jsmind.screenshot.js)正常引入是这样的&#xff0c;然后渲染也没问题 <template><div …

vue 快速自定义分页el-pagination

vue 快速自定义分页el-pagination template <div style"text-align: center"><el-paginationbackground:current-page"pageObj.currentPage":page-size"pageObj.page":page-sizes"pageObj.pageSize"layout"total,prev,…

uni-app中的uni.requireNativePlugin()

这个方法是用来引入原生插件的方法&#xff0c;自 HBuilderX 1.4 版本起&#xff0c;uni-app 支持引入原生插件&#xff0c;使用方式如下&#xff1a; const PluginName uni.requireNativePlugin(PluginName); // PluginName 为原生插件名称 引入插件的类型有三种&#xff1…

(二)RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】 文章目录 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】**安装Erlang**安装RabbitMQ账户管理管控台Docker安装RabbitM…

添加USB转串口设备驱动-迅为i.MX8M开发板

对于通过 USB 接口访问的模块&#xff0c;在 Linux 内核中集成 USB 驱动程序。我们需要配置内核选中支持 GSM 和 CDMA 模块的 USB 转串口驱动 > Device Drivers -> USB support (USB_SUPPORT [y]) -> USB Serial Converter support (USB_SERIAL [y]) -> USB driver…

Chrome 115 有哪些值得关注的新特性?

今天带大家一起来了解一下 Chrome 115 值得关注的新特性。 滚动动画 用滚动驱动的动画是网站上非常常见的用户体验模式&#xff0c;比如当页面向前或向后滚动时&#xff0c;对应的动画也会向前或向后移动。 比如下面图中这种比较常见的&#xff0c;页面顶部的进度条随着滚动…

Visual Studio 2022 从下载安装到如何使用的全面讲解 (图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; Visual Studio 2022 的介绍&#x1f4ad; Visual Studio 2022 的下载⌨️ 安装…

SPECjvm2008_1_01 openjdk8 x86_64 ARM64 运行时长、成绩 Run is valid, but not compliant

i5-9600k 架构&#xff1a; x86_64CPU 运行模式&#xff1a; 32-bit, 64-bitAddress sizes: 39 bits physical, 48 bits virtual字节序&#xff1a; Little Endian CPU: 6在线 CPU 列表&#xff1a; …

逻辑分析仪分析NEC协议

这里主要学习使用逻辑分析仪&#xff0c;记录一下。 这位兄弟讲得很清楚&#xff1a; https://blog.csdn.net/u013606261/article/details/112977378 这张图也不错&#xff0c;拿来用 这是淘宝上20多块钱的逻辑分析仪 录下的&#xff1a; HS0038B 这个红外一体化接收头&…

工业智能网关实现PLC控制柜实时监测,让污水泵站管理更加方便

随着工业经济与技术的不断发展&#xff0c;自动化控制技术在更多领域得到应用&#xff0c;在农村污水中&#xff0c;污水泵站作为重要的基础设施&#xff0c;其自动化程度直接影响到系统的运行效率&#xff0c;监控能力则影响到系统的运维质量。可编程逻辑控制器(PLC)作为一种实…