本节书摘来自异步社区《python高性能编程》一书中的第2章,第2.10节,作者[美] 戈雷利克 (micha gorelick),胡世杰,徐旭彬 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
guppy项目有一个内存堆的调查工具叫作heapy,可以让你查看python堆中对象的数量以及每个对象的大小。当你需要知道某一时刻有多少对象被使用以及它们是否被垃圾收集时,你尤其需要这种深入解释器内部去了解内存中实际内容的能力。如果你受困于内存泄漏(可能由于你的对象的引用隐藏于一个复杂系统中),那么这个工具能帮你找到问题的关键点。
当你在审查你的代码,看它是否如你预期那样生成对象时,你会发现这个工具非常有用——结果很可能令你吃惊,并为你带来新的优化方向。
为了使用heapy,你需要用命令pip install guppy安装guppy包。
例2-12的代码是julia代码的一个略有修改的版本。calc_pure_python使用了堆对象hpy,我们在三个地方打印堆的内容。
例2-12 用heapy查看代码运行时对象数量的变化
例2-13的输出显示了内存的使用在创建zs和cs列表后变得有趣:它增长了大约80mb,因为2000000个复数对象消耗了64000000字节。这些复数对象占据了目前使用的大多数内存。如果你想要优化这个程序的内存用量,这个结果可用于揭示目前保存的对象数量以及它们总共占用的空间。
例2-13 heapy输出显示了我们代码执行时每一个主要阶段的对象总数
第三段显示了在计算完julia集合后,我们占用了94mb的内存。除了之前的复数,我们现在还保存了大量的整数,列表中的项目也变多了。
hpy<code>.setrelheap()可以用来创建一个内存断点,当后续调用hpy</code>.heap()时就会产生一个跟这个断点的差额。这样你就可以略过断点前由python内部操作导致的内存分配。