在 Python 中分析内存使用情况
介绍
单个物体的尺寸分析
内存分析的最低层涉及查看内存中的单个对象。您可以通过打开 shell 并执行如下操作来执行此操作:
>>> import sys
>>> sys.getsizeof({})
136
>>> sys.getsizeof([])
32
>>> sys.getsizeof(set())
112
上面的代码片段说明了与列表对象相关的开销。列表为 32 个字节(在运行 Python 2.7.3 的 32 位计算机上)。这种分析方式在确定要使用哪种数据类型时很有用。
分析单个函数或方法
分析单个方法或函数的最简单方法是使用开源的memory-profiler包。它与我之前写过的line_profiler类似。
您可以通过在任何函数或方法周围放置@profile装饰器并运行python -m memory_profiler myscript 来使用内存分析。脚本退出后,您将看到逐行内存使用情况。
如果您想要分析一段占用大量内存的代码,那么这种方法就非常有用,但如果您不知道内存使用量最大的代码在哪里,这种方法就没什么用了。在这种情况下,首先需要一种更高级的分析方法。
分析整个应用程序
古比
要使用guppy,你需要在代码中添加如下内容:
from guppy import hpy
h = hpy()
print h.heap()
这将打印出一个按对象类型分组的使用情况表。以下是我一直在开发的PyQt4应用程序示例:
Partition of a set of 235760 objects. Total size = 19909080 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 97264 41 8370996 42 8370996 42 str
1 47430 20 1916788 10 10287784 52 tuple
2 937 0 1106440 6 11394224 57 dict of PyQt4.QtCore.pyqtWrapperType
3 646 0 1033648 5 12427872 62 dict of module
4 11683 5 841176 4 13269048 67 types.CodeType
5 11684 5 654304 3 13923352 70 function
6 1200 1 583872 3 14507224 73 dict of type
7 782 0 566768 3 15073992 76 dict (no owner)
8 1201 1 536512 3 15610504 78 type
9 1019 0 499124 3 16109628 81 unicode
如果您有一个大型应用程序并且使用相对较少的对象类型,这种类型的分析可能会很困难。
主键
最后,我最近发现,memory-profiler附带了一个名为 mprof 的脚本,它可以显示应用程序生命周期内的内存使用情况。如果你想查看内存是否定期得到清理和释放,这会很有用。
使用 mprof 非常简单,只需在您选择的 shell 中运行mprof run script script_args即可。mprof 将自动创建脚本内存使用情况随时间变化的图表,您可以通过运行mprof plot来查看该图表。请注意,绘图需要matplotlib。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~