Python利用memory_profiler实现内存分析

任何编程语言开发的项目代码都是需要考虑内存问题的,有时候当项目体量比较庞大以后若是出现内存泄漏等问题分析起来更是哦力不从心的。

因此,平时建议从开发的每个函数入手尽量编写的标准、规范,不至于造成后期无法修复的BUG,这个python非标准模块memory_profiler值得一看。

使用memory_profiler能分析出每行代码块的内存资源使用情况,有两种方式可以参考,一种是开发完代码块通过命令行的方式执行即可。

另一种则在直接代码块时直接生成内r内存资源情况的日志可以随时查看。

使用python pip的方式安装memory_profiler非标准库,默认使用清华大学的python镜像站。

pip install memory_profiler -i https://pypi.tuna.tsinghua.edu.cn/simple/

开发一个函数func_while,其中运行一个100万次的循环并且在循环中打印每一次循环执行时的时间戳,将内存使用情况保存到日志文件memory.log中。

# Importing the timeit module.
import timeit

# A logging library.
from loguru import logger

# A decorator that will wrap the function and add some code to it.
from memory_profiler import profile

@profile(precision=4, stream=open("memory.log", "w+"))
def func_while():
    """
    It prints the numbers from 0 to 999999.
    """
    begin = timeit.default_timer()
    logger.info("开始循环应用:{0}".format(begin))

    n = 0

    while n < 1000000:
        logger.info('当前时间戳:{0}'.format(timeit.default_timer()))
        n = n + 1

    end = timeit.default_timer()
    logger.info("结束循环应用:{0}".format(end))

    logger.info('循环应用总共用时:{0}'.format(str(end - begin)))

func_while()

# 2022-09-17 22:18:18.767 | INFO     | __main__:func_while:39 - 当前时间戳:1397.349649192
# 2022-09-17 22:18:18.769 | INFO     | __main__:func_while:39 - 当前时间戳:1397.350927206
# 2022-09-17 22:18:18.770 | INFO     | __main__:func_while:39 - 当前时间戳:1397.352256128
# 2022-09-17 22:18:18.771 | INFO     | __main__:func_while:39 - 当前时间戳:1397.353639651
# 2022-09-17 22:18:18.773 | INFO     | __main__:func_while:39 - 当前时间戳:1397.354919308
# 2022-09-17 22:18:18.774 | INFO     | __main__:func_while:43 - 结束循环应用:1397.35619568
# 2022-09-17 22:18:18.775 | INFO     | __main__:func_while:45 - 循环应用总共用时:1394.6941001149999

从上面的运行时间可以看出整个100万次的循环整整跑了23分钟才完成,本身电脑性能不是很好为了测试差点就宕机了。下面是memory.log内存分析的文件中的部分截图。

从结果可以发现在我的while循环这一行下面的代码块整个内存显示-65303MB左右,可以看出整个内存消耗出现非常大的问题,怪不得的应用的主线程直接就卡死了。

在上面的分析中,我们选用的内存统计的精度是保留四位小数,也就是@profile注解的precision属性值的设置是4。

接下来使用第二种方式,也就是直接运行查看效果,或者在命令行执行.py的python文件效果是一样的都会展示出内存的消耗情况,但是这种情况可能会出现内存精度缺失的情况。

为了保险起见,这次我还是直接选用1万次循环来进行测试查看效果,循环次数过多怕把我的操作机直接搞崩溃了!

@profile(precision=4)
def func_while2():
    """
    It prints the numbers from 0 to 9999.
    """
    begin = timeit.default_timer()
    logger.info("开始循环应用:{0}".format(begin))

    n = 0

    while n < 10000:
        logger.info('当前时间戳:{0}'.format(timeit.default_timer()))
        n = n + 1

    end = timeit.default_timer()
    logger.info("结束循环应用:{0}".format(end))

    logger.info('循环应用总共用时:{0}'.format(str(end - begin)))

func_while2()

# 2022-09-17 22:37:38.086 | INFO     | __main__:func_while2:81 - 当前时间戳:15.020861643
# 2022-09-17 22:37:38.087 | INFO     | __main__:func_while2:85 - 结束循环应用:15.022343696
# 2022-09-17 22:37:38.089 | INFO     | __main__:func_while2:87 - 循环应用总共用时:12.908313867
# Filename: C:/the-public/the-public/test013/test7.py
#
# Line #    Mem usage    Increment  Occurrences   Line Contents
# =============================================================
#     73  29.7266 MiB  29.7266 MiB           1   @profile(precision=4)
#     74                                         def func_while2():
#     75  29.7266 MiB   0.0000 MiB           1       begin = timeit.default_timer()
#     76  29.7422 MiB   0.0156 MiB           1       logger.info("开始循环应用:{0}".format(begin))
#     77
#     78  29.7422 MiB   0.0000 MiB           1       n = 0
#     79
#     80  29.8125 MiB   0.0000 MiB       10001       while n < 10000:
#     81  29.8125 MiB   0.0703 MiB       10000           logger.info('当前时间戳:{0}'.format(timeit.default_timer()))
#     82  29.8125 MiB   0.0000 MiB       10000           n = n + 1
#     83
#     84  29.8125 MiB   0.0000 MiB           1       end = timeit.default_timer()
#     85  29.8125 MiB   0.0000 MiB           1       logger.info("结束循环应用:{0}".format(end))
#     86
#     87  29.8125 MiB   0.0000 MiB           1       logger.info('循环应用总共用时:{0}'.format(str(end - begin)))

显然执行1万次循环结果算是正常的,增量只有0.0703 MiB,只用了13秒就执行完成了,可能使用for循环的话效果还要好一些。

到此这篇关于Python利用memory_profiler实现内存分析的两种方法总结的文章就介绍到这了,更多相关Python memory_profiler内存分析内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python内存监控工具memory_profiler和guppy的用法详解

    python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大.我在跑py-faster-rcnn的demo时,基本上跑2000张图像,16g内存就要爆了.于是尝试用python的内存监控工具来调试程序,找到不能膨胀的变量,然后del之,再手动回收内存gc.collec() 下面是我用的两个内存监视工具,一个是按每行代码查看内存占用的工具memory_profil

  • 使用memory_profiler监测python代码运行时内存消耗方法

    前几天一直在寻找能够输出python函数运行时最大内存消耗的方式,看了一堆的博客和知乎,也尝试了很多方法,最后选择使用memory_profiler中的mprof功能来进行测量的,它的原理是在代码运行过程中每0.1S统计一次内存,并生成统计图. 具体的使用方式如下: 首先安装memory_profiler和psutil(psutil主要用于提高memory_profile的性能,建议安装)(可使用pip直接安装) pip install memory_profiler pip install p

  • python memory_profiler库生成器和迭代器内存占用的时间分析

    不进行计算时,生成器和list空间占用 import time from memory_profiler import profile @profile(precision=4) def list_fun(): start = time.time() total = ([i for i in range(5000000)]) print('iter_spend_time:',time.time()-start) @profile(precision=4) def gent_func(): gen

  • Python利用memory_profiler查看内存占用情况

    目录 简介 安装 使用方法 1.通过装饰器运行 2.通过命令行运行 补充 简介 memory_profiler是第三方模块,用于监视进程的内存消耗以及python程序内存消耗的逐行分析.它是一个纯python模块,依赖于psutil模块. 安装 pip install memory_profiler 使用方法 1.通过装饰器运行 @profile def func1(): 2.通过命令行运行 python -m memory_profiler test_code.py 案例源码: # -*- c

  • Python利用memory_profiler实现内存分析

    任何编程语言开发的项目代码都是需要考虑内存问题的,有时候当项目体量比较庞大以后若是出现内存泄漏等问题分析起来更是哦力不从心的. 因此,平时建议从开发的每个函数入手尽量编写的标准.规范,不至于造成后期无法修复的BUG,这个python非标准模块memory_profiler值得一看. 使用memory_profiler能分析出每行代码块的内存资源使用情况,有两种方式可以参考,一种是开发完代码块通过命令行的方式执行即可. 另一种则在直接代码块时直接生成内r内存资源情况的日志可以随时查看. 使用pyt

  • Python利用PyExecJS库执行JS函数的案例分析

      在Web渗透流程的暴力登录场景和爬虫抓取场景中,经常会遇到一些登录表单用DES之类的加密方式来加密参数,也就是说,你不搞定这些前端加密,你的编写的脚本是不可能Login成功的.针对这个问题,现在有三种解决方式: ①看懂前端的加密流程,然后用脚本编写这些方法(或者找开源的源码),模拟这个加密的流程.缺点是:不懂JS的话,看懂的成本就比较高了: ②selenium + Chrome Headless.缺点是:因为是模拟点击,所以效率相对①.③低一些: ③使用语言调用JS引擎来执行JS函数.缺点是

  • 利用python调用摄像头的实例分析

    这篇文章主要介绍了python调用摄像头的示例代码,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 一.打开摄像头 import cv2 import numpy as np def video_demo(): capture = cv2.VideoCapture(0)#0为电脑内置摄像头 while(True): ret, frame = capture.read()#摄像头读取,ret为是否成功打开摄像头,true,false. frame为视频的每一帧图像 frame = c

  • python利用pandas分析学生期末成绩实例代码

    安装Pandas Pandas是构建在Python编程语言之上的一个快速.强大.灵活且易于使用的开源数据分析和操作工具.Pandas是基于Numpy的专业数据分析工具,可以灵活高效的处理各种数据集. 我们使用pip进行安装(如果没有可自行查询如何安装pip)安装panda最简单的方法是将其作为Anaconda的一部分安装,Anaconda主要用于数据分析和科学计算.还提供源代码.PyPI.ActivePython.各种Linux发行版或开发版本进行安装的说明. 当然,最为基础的Python环境还

  • Python利用Charles 实现全部自动答题思路流程分析

    利用Charles 达成"我是达人"答题类爆破思路 最近公司需要使用"我是答题"小程序,对武汉疫情进行知识问题:榜单靠前的也有一定的学分奖励:虽然平时总不屑于公司组织的此类活动,但是看了这次活动形式,还是决定直接"爆破 0x01 思路18年大火的直播答题中,对某答题app也进行了类似爆破,并薅了不少羊毛,到了后期已经做到了全自动化的答题,并且是100%正确正常情况下小程序和服务端通信流程 使用charles对请求进行串改流程 因为我的主力电脑就是MacOS

  • 利用python实现简单的情感分析实例教程

    目录 1 数据导入及预处理 1.1 数据导入 1.2 数据描述 1.3 数据预处理 2 情感分析 2.1 情感分 2.2 情感分直方图 2.3 词云图 2.4 关键词提取 3 积极评论与消极评论 3.1 积极评论与消极评论占比 3.2 消极评论分析 总结 python实现简单的情感分析 1 数据导入及预处理 1.1 数据导入 # 数据导入 import pandas as pd data = pd.read_csv('../data/京东评论数据.csv') data.head() 1.2 数据

  • Python利用matplotlib画出漂亮的分析图表

    目录 前言 数据集引入 折线图 饼图 散点图 面积图 直方图 条形图 前言 作为一名优秀的分析师,还是得学会一些让图表漂亮的技巧,这样子拿出去才更加有面子哈哈.好了,今天的锦囊就是介绍一下各种常见的图表,可以怎么来画吧. 数据集引入 首先引入数据集,我们还用一样的数据集吧,分别是 Salary_Ranges_by_Job_Classification以及 GlobalLandTemperaturesByCity.(具体数据集可以后台回复 plot获取) # 导入一些常用包 import pand

  • python 监控某个进程内存的情况问题

    目录 python监控某个进程内存 python监控进程并重启 分析了具体思路 相关代码很简单 python监控某个进程内存 测试场景: 某个客户端程序长时间运行后存在内存泄漏问题,现在开发解决了需要去验证这个问题是否还存在,并要求出具相应测试验证报告. 手段: 需要有一个工具能够实时去获取该程序进程一直运行下占用内存,CPU使用率情况. 方法: python去实现这么个监控功能 import sys import time import psutil sys.argv # get pid fr

  • Python利用pdfplumber实现读取PDF写入Excel

    目录 一.Python操作PDF 13大库对比 二.pdfplumber模块 1.安装 2. 加载PDF 3. pdfplumber.PDF类 4. pdfplumber.Page类 三.实战操作 1. 提取单个PDF全部页数 2. 批量提取多个PDF文件 一.Python操作PDF 13大库对比 PDF(Portable Document Format)是一种便携文档格式,便于跨操作系统传播文档.PDF文档遵循标准格式,因此存在很多可以操作PDF文档的工具,Python自然也不例外. Pyth

随机推荐