程序使用了多少内存?

现在我们对计时有了较好的理解,那么让我们继续弄清楚程序使用了多少内存。我们很幸运,Fabian Pedregosa模仿Robert Kern的line_profiler实现了一个不错的内存分析器。

首先使用pip安装:

这里建议安装psutil包,因为它可以大大改善memory_profiler的性能)。

就像line_profiler,memory_profiler也需要在感兴趣的函数上面装饰@profile装饰器:

想要观察你的函数使用了多少内存,像下面这样执行:

一旦程序退出,你将会看到看起来像这样的输出:

line_profiler和memory_profiler的IPython快捷方式

memory_profiler和line_profiler有一个鲜为人知的小窍门,两者都有在IPython中的快捷命令。你需要做的就是在IPython会话中输入以下内容:

在这样做的时候你需要访问魔法命令%lprun和%mprun,它们的行为类似于他们的命令行形式。主要区别是你不需要使用@profiledecorator来修饰你要分析的函数。只需要在IPython会话中像先前一样直接运行分析:

这样可以节省你很多时间和精力,因为你的源代码不需要为使用这些分析命令而进行修改。

内存泄漏在哪里?

cPython解释器使用引用计数做为记录内存使用的主要方法。这意味着每个对象包含一个计数器,当某处对该对象的引用被存储时计数器增加,当引用被删除时计数器递减。当计数器到达零时,cPython解释器就知道该对象不再被使用,所以删除对象,释放占用的内存。

如果程序中不再被使用的对象的引用一直被占有,那么就经常发生内存泄漏。

查找这种“内存泄漏”最快的方式是使用Marius Gedminas编写的objgraph,这是一个极好的工具。该工具允许你查看内存中对象的数量,定位含有该对象的引用的所有代码的位置。

一开始,首先安装objgraph:

一旦你已经安装了这个工具,在你的代码中插入一行声明调用调试器:

最普遍的对象是哪些?

在运行的时候,你可以通过执行下述指令查看程序中前20个最普遍的对象:

哪些对象已经被添加或删除?

我们也可以查看两个时间点之间那些对象已经被添加或删除:

谁引用着泄漏的对象?

继续,你还可以查看哪里包含给定对象的引用。让我们以下述简单的程序做为一个例子:

想要看看哪里包含变量x的引用,执行objgraph.show_backref()函数

该命令的输出应该是一副PNG图像,保存在/tmp/backrefs.png,它看起来是像这样:

最下面有红字的盒子是我们感兴趣的对象。我们可以看到,它被符号x引用了一次,被列表y引用了三次。如果是x引起了一个内存泄漏,我们可以使用这个方法,通过跟踪它的所有引用,来检查为什么它没有自动的被释放。

回顾一下,objgraph 使我们可以:

  • 显示占据python程序内存的头N个对象
  • 显示一段时间以后哪些对象被删除活增加了
  • 在我们的脚本中显示某个给定对象的所有引用

Python性能分析指南——中相关推荐

  1. Python性能优化指南--让你的Python代码快x3倍的秘诀

    Python性能优化指南 Python最为人诟病的就是其执行速度.如何让Python程序跑得更快一直是Python核心团队和社区努力的方向.作为Python开发者,我们同样可以采用某些原则和技巧,写出 ...

  2. Python性能分析优化及测试

    Python性能分析优化及测试 写在前面 CPU分析工具 简单的time方法以及包装成的修饰器 timeit UNIX的time命令进行简单的计时 cProfile:分析每个函数运行花费的时间 lin ...

  3. PEP8 - Python 代码风格指南中英对照

    PEP8 - Python 代码风格指南中英对照 Introduction A Foolish Consistency is the Hobgoblin of Little Minds Code la ...

  4. python性能分析(一)——使用timeit给你的程序打个表吧

    前言 我们可以通过查看程序核心算法的代码,得知核心算法的渐进上界或者下界,从而大概估计出程序在运行时的效率,但是这并不够直观,也不一定十分靠谱(在整体程序中仍有一些不可忽略的运行细节在估计时被忽略了) ...

  5. Python 性能分析入门指南

    为什么80%的码农都做不了架构师?>>>    在岭南六少博客找到的好东西. 注: 本文的原作者是 Huy Nguyen ,原文地址为 A guide to analyzing Py ...

  6. python性能分析工具模块_python——关于Python Profilers性能分析器

    1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和ps ...

  7. Python性能分析的学习笔记

    1 介绍 在这篇文章中,我们将讲述一下关于python代码的性能分析- 2 资料收藏 Pyinstrument Pyinstrument是我在<涛哥聊python>中看到的一个性能分析工具 ...

  8. Python性能分析利器pyinstrument讲解

    一.前言 程序的性能也是非常关键的指标,很多时候你的代码跑的快,更能够体现你的技术.最近发现很多小伙伴在性能分析的过程中都是手动打印运行时间的方式来统计代码耗时的: import datetime s ...

  9. python性能分析与优化

    性能分析: 1.种类: 基于事件的性能分析通过收集程序执行过程中的具体事件进行工作,每个调用都会触发,输出数据量大,精度高def profiler(frame, event, arg):print ' ...

最新文章

  1. ContentType的集中数据编码格式
  2. nginx如何开启debug日志及相关配置
  3. python中is和 的区别_Python中is和==的区别
  4. c++ 模板类实现堆栈实验报告_C++类模板实现栈
  5. 【MyBatis框架】MyBatis入门程序第二部分
  6. Java边缘填充_任意画一个多边形,用边缘填充算法填充
  7. 生命周期 用户可以操作dom_当面试官问:能否介绍下Vue生命周期时,该如何回答...
  8. Mac版PScc破解安装方法
  9. Axure RP8.0仿制知乎页面(更新1-菜鸟级)
  10. Matlab绘制散点密度图
  11. leetcode 53. Maximum Subarray(DP动态规划问题)
  12. 住房公积金专办员题库(含答案)
  13. 支付宝:支付宝里面国际驾照认证件的申请领取步骤
  14. 如何在Microsoft Teams视频会议中看起来像土豆
  15. IDC机房运维每天做什么?
  16. java ocr 识别中文
  17. Linux下查看SSD4K对齐EXT4分区开启Trim及验证的方法
  18. Android Studio 4.0 新功能与优化
  19. Ocelot的使用(结合Consul服务注册和发现)
  20. JavaCV进阶opencv图像处理:10行代码快速实现扫描识别图片中的二维码

热门文章

  1. NOIP模拟题——B
  2. 综合性深入的技术文章-20161103
  3. Web开发的那点事--数据持久层常用功能
  4. numpy数组切片:一维/二维/数组
  5. C#简介- 类和对象
  6. DataGrid中自带的分页功能的使用
  7. C++拾趣——类构造函数的隐式转换
  8. 开源库nothings/stb的介绍及使用(图像方面)
  9. C++11中std::condition_variable的使用
  10. gtest使用初级指南