Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
在这篇文章中,我将讨论一些工具,可以帮助我们解决Python中棘手的问题。
特别是在使用PyPy时:内存消耗问题。
为什么我们首先关心这个? 为什么我们不关心性能? 这些问题的答案是相当复杂的,但我会总结一下。
PyPy是Python解释器的一个替代品,它具有比CPython更好的优势:速度(尽管它是即时编译器),兼容性(几乎可以替代CPython)和并发(使用stackless和greenlet)。
PyPy的一个缺点是,由于它是JIT并实现垃圾回收器,所以它通常比CPython消耗更多的内存。然而,在某些情况下,它能够比CPython消耗更少的内存。
接下来我们将介绍如何测量应用程序消耗的内存量。
系列索引
下面的链接将在文章发布后生效:
1.安装
2.内存分析
3.CPU分析 - Python脚本
4.CPU分析 - Python解释器
诊断内存使用情况
memory_profiler
memory_profiler,一个可用于测量解释器运行工作负载的内存量的库。可以通过pip安装:
还要安装psutil依赖:
该工具的优点在于它可以在Python脚本中逐行显示内存消耗。这有助于我们从脚本中找到可以重写的地方。但这种分析有一个缺点,就是代码将比通常的脚本运行速度慢10到20倍。
如何使用它?你只需将@profile()指令添加到需要测量的函数中即可。
让我们在实际情况下看看! 我们将使用上一篇文章中的素材脚本作为模型,稍加修改以消除统计部分。代码放在GitHub上。
要开始测量,请对使用以下命令:
或更短,通过直接在脚本中导入memory_profiler:
执行这行后,我们将看到PyPy:
我们可以看到这个脚本使用了24.371094 MiB的RAM。让我们分析一下。我们看到,大多数在构建数组时使用。它不包括偶数,并保存所有其他的数。
我们可以通过调用带有增量参数的range函数来改善这一点。 在这种情况下,脚本将如下所示:
如果我们再次测量,我们看到:
太好了,现在我们的内存消耗降到了22.75 MiB。也可以通过使用列表推导来改进一点。
再次测量:
我们的最终版本的脚本只消耗22.421875 MiB。与第一版相比,这几乎减少了10%的内存消耗。
英文原文:https://pythonfiles.wordpress.com/2017/05/18/hunting-python-performance-part-2/
译者:moocou