当前位置: 首页 > news >正文

Python代码优化工具——memory_profiler

Python代码优化工具——memory_profiler

  • 一、工具介绍
  • 二、安装
  • 三、分析结果注解
  • 四、使用
    • 1、使用```python```命令进行分析
      • (1)使用姿势1
      • (2)示例1
      • (3)该姿势的利弊1
      • (4)使用姿势2
      • (5)示例2
      • (6)该姿势的利弊2
    • 2、使用```mprof```命令进行分析
      • (1)使用姿势
      • (2)该姿势的利弊
    • 3、memory_profiler其他用法

一、工具介绍

memory_profiler是Python的一个第三方库,其功能时基于函数的逐行代码分析工具。通过该库,可以对目标函数(允许分析多个函数)进行内存消耗分析,便于代码调优。pypi文档

二、安装

使用命令pip install memory_profiler进行安装。

三、分析结果注解

先放上这个工具的分析结果,各位朋友可以看一下是否满足自己的要求,再决定是否安装以及使用。
请添加图片描述
部分参数注解:

  • Mem usage:执行完改行代码后内存的使用情况。
  • Increment:执行完该行代码,内存增加了多少。
  • Occurrences:该行被命中多少次。
  • Line #:代码所在行号。
  • Line Contents:该行代码的内容。

四、使用

1、使用python命令进行分析

使用命令行模式进行分析又有两个小姿势。

(1)使用姿势1

在需要分析的函数前面增加@profile装饰器,在命令行使用python -m memory_profile <文件名>开始分析。

(2)示例1

示例代码如下

@profile()
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == "__main__":
    my_func()

分析结果如下
请添加图片描述

(3)该姿势的利弊1

优点

  • 使用方便,只需在待分析的函数前加装饰器@profile即可。
  • 用于分析的函数可以不在同一个文件内,方便分析较为复杂、调用方法较多的程序。

缺点

  • 因为需要在所有待分析的函数前都需要加装饰器,所以添加和删除的麻烦度与待分析的函数的数量成正比。
  • 因为@profile并不是第三方导入的,所以python <文件名>方式运行代码时会报错。
  • 同样是因为@profile不是第三方导入的,在IDEA中该段代码会有代码错误的红色波浪线提示,强迫症震怒。

(4)使用姿势2

代码里加入导包语句from memory_profiler import profile,在需要分析的函数前面增加@profile装饰器,在命令行使用python <文件名>开始分析。

(5)示例2

示例代码如下

from memory_profiler import profile

@profile(precision=5)
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == "__main__":
    my_func()

分析结果如下
请添加图片描述

(6)该姿势的利弊2

小姿势2的优缺点与小姿势1的优缺点基本相同,相同点此处不再赘述。
优点:

  • 因为在代码里显示加入了导包语句,所以@profile装饰器会被IDEA正常识别,且可以正常运行。
  • 小姿势2中可以在装饰器里增加precision参数,该参数的作用是指定分析结果的精准度。可以自行对比示例1与实例2的代码和结果。
    缺点:
  • 每个加上装饰器的文件都需要显示增加导包语句。
  • 代码里使用姿势2时,可以在命令行处使用姿势1来进行分析,但percision参数会被忽略。

2、使用mprof命令进行分析

这个姿势很强大,因为使用python命令执行代码只是查看的当前的内存情况,但mprof命令执行代码则会将分析结果+时间戳保存到.dat文件里,使用mprof命令+matplotlib包的组合,可以绘画出某一段时间内的内存使用情况;此外,mprof还可以在单进程、多进程、子进程等情况下进行内存分析。

(1)使用姿势

mprof run <executable>. # 单进程情况下统计内存情况。
mprof run --multiprocess <executable># 多进程情况下,跟踪统计每个子进程内存情况。其结果是主进程自己的数据 和 每个子进程自己的数据。
mprof run --include-children <executable># 多进程情况下,把所有子进程内存情况认为是主进程的内存情况,其统计数据只显示主进程(只不过主进程的数据是主进程内存+子进程)。
mprof run --include-children --multiprocess <executable>  # 多进程情况下,跟踪统计每个子进程的内存使用情况,同时把所有子进程的内存使用情况与主进程自己的内存使用情况相加。其统计结果是主进程自己的数据 和 每个子进程自己的数据 和 主进程+子进程。

(2)该姿势的利弊

优点

  • 将内存使用情况与时间维度相结合,使得测试适用的情况更广。
    缺点
  • .dat文件只有在代码执行完毕后才会生成,所以不适合生产环境的内存检测。

3、memory_profiler其他用法

memory_profiler除了逐行分析内存情况,还可以分析服务进程的内存使用情况以及内存采样等等,更多的骚操作可以阅读官方文档。
另附一大佬写的文章

相关文章:

  • LeetCode220831_92、滑动窗口最大值
  • 哈希碰撞概率计算
  • 2021年超全中高级Java工程师面试题+答案
  • 阿里新产MySQL性能优化实践笔记,GitHub已获千万推荐
  • yolov5篇---官方ultralytics / yolov5代码复现,训练自己的数据集
  • avalanche 配置dns解析域名
  • 【Wordpress】wordpress根据需要DIY配置(更新中)
  • 遥感影像分类任务的复现
  • springboot+vue实现登录案例(附VUE整个项目代码)
  • 如何使用LOTO示波器 绘制 频率响应特性曲线?
  • 智能科学与技术——介绍概要
  • Controller设计--Kafka从入门到精通(十五)
  • 数据结构之查找和排序
  • CREO:CREO软件之工程图界面的【创建】、【布局】、【表】、【注释】的简介(图文教程)之详细攻略
  • .NET 回调、接口回调、 委托
  • [译]如何构建服务器端web组件,为何要构建?
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES10 特性的完整指南
  • github指令
  • HTML-表单
  • Iterator 和 for...of 循环
  • PHP面试之三:MySQL数据库
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Zsh 开发指南(第十四篇 文件读写)
  • 第十八天-企业应用架构模式-基本模式
  • 前端面试之闭包
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 走向全栈之MongoDB的使用
  • # Maven错误Error executing Maven
  • #{}和${}的区别是什么 -- java面试
  • (2)MFC+openGL单文档框架glFrame
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (四)模仿学习-完成后台管理页面查询
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Scala的“=”符号简介
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *** 2003
  • *Django中的Ajax 纯js的书写样式1
  • .bat文件调用java类的main方法
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net MVC4 上传大文件,并保存表单
  • .Net 代码性能 - (1)
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net程序集学习心得
  • .NET建议使用的大小写命名原则
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • @AutoConfigurationPackage的使用
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [AutoSar]BSW_Com02 PDU详解
  • [CTF]2022美团CTF WEB WP