Python memory-profiler 模块

2025年03月17日 | 阅读 9 分钟

我们可能都听说过应用程序处理缓慢或执行缓慢,但我们是否曾试图了解其原因?应用程序处理或执行命令所需的时间可能是原因,但内存使用情况又如何呢?RAM 或系统内存对于应用程序的处理和执行时间至关重要,但没有人真正谈论它。执行或处理命令时使用的内存量(RAM)也会影响应用程序的执行速度。这听起来可能很荒谬或微不足道,但它在我们的系统及其上安装的应用程序的性能中起着非常重要的作用。因此,具有较少 RAM 的应用程序与具有更多 RAM 的应用程序相比,需要更长的时间来执行是很常见的。

同样的情况也适用于执行程序,这就是为什么在执行程序时查看使用了多少内存非常重要。这将有助于我们管理内存使用或以更好的方式设计程序,并牢记内存使用。但是,现在,我们脑海中会浮现一些问题,例如我们如何做到这一点,跟踪程序的内存使用情况,或者找出程序中的哪些函数使用更多内存并使其执行缓慢?我们在 Python 中有一个内存分析模块,它可以帮助我们跟踪程序及其函数的内存使用情况。在本教程中,我们将学习 Python memory-profiler 模块,以及如何使用该模块在程序执行时跟踪 RAM 的使用情况及其分布。

Python memory-profiler 模块简介

memory-profiler 是一个开源的 Python 模块,它提供了用于在程序执行期间跟踪内存消耗的函数,我们甚至可以在程序和函数中逐行分析内存消耗。memory-profiler 模块还有助于我们分析 Python 的性能以及 RAM 消耗在执行期间如何影响性能和执行速度。在这里,我们将通过示例程序讨论 memory-profiler 模块的安装和实现,但首先,我们将了解该模块的优点和功能。

Python memory-profiler 模块:优点与功能

我们中的许多人可能都看到过许多人抱怨 Python 是一种比其他语言慢的编程语言,它需要更长的时间来执行程序或应用程序。好吧,如果我们问他们用什么方法来计算执行速度,我们收到的第一个答案将是 Python 执行代码或代码部分所花费的总时间或类似内容。但我们会发现,他们没有人会谈论使用情况或执行该特定代码部分时使用了多少 RAM。这对于程序的执行速度来说可能显得微不足道,但实际上它非常重要,因为它会影响 Python 执行程序的速度。因此,在程序执行期间分析内存使用情况同样重要,这要归功于 Python 的 memory-profiler 模块。Python memory-profiler 模块在监控和分析程序执行期间的内存使用方面具有以下功能和优点:

  • 该模块有助于我们跟踪 Python 程序在执行期间的内存使用情况,以便我们了解性能和速度的原因
  • 借助 memory-profiler 模块,我们甚至可以跟踪程序特定部分的内存使用情况
  • 程序在执行时,我们甚至可以逐行监控内存消耗

这些是使用 memory-profiler 模块的一些优点,它还有助于提高 Python 的性能。

Python memory-profiler 模块:安装

Python memory-profiler 模块不是内置模块,因此,如果我们想理解它的实现并在开发过程中使用它,我们就必须在系统中安装该模块,或者确保该模块已正确安装在我们的系统中。如果系统中不存在 memory-profiler,我们可以通过多种方法进行安装,但我们可以选择的最简单的方法是通过 pip 安装程序进行安装。因此,在此安装部分,我们将通过 pip 安装程序使用以下命令来安装 memory-profiler 模块:

首先,我们必须在命令提示符终端 shell 中键入上述命令,然后按“enter”键开始安装过程。一旦安装过程开始,它将花费一些时间,我们必须等待直到它在我们的系统中成功安装。

Python memory-profiler Module

如我们所见,memory-profiler 已成功安装在我们的系统中,现在我们可以继续进行实现,并且我们现在还可以将此模块用于开发目的。

注意:在本教程的实现部分,我们将在一个示例程序中使用 requests 模块和 memory-profiler 模块,以了解通过 memory-profiler 模块进行内存跟踪和分析的实际实现和用法。因此,在我们继续实现部分之前,我们应该确保 requests 模块已安装在我们的系统中,如果它不存在,我们可以使用终端中的以下 pip 命令从 pip 安装程序进行安装:


Python memory-profiler Module

如我们所见,requests 模块已安装在我们的系统中,因此显示了 requirement already satisfied 消息。

Python memory-profiler 模块:实现

我们将在这里使用两个示例来理解 memory-profiler 模块的实现,我们将分析程序在输出中显示结果时的内存使用情况。让我们看以下两个示例程序来理解 memory-profiler 模块的实现:

实现 1:分析默认函数的内存使用情况

在此实现部分,我们将在示例程序中创建一个默认函数并在其中定义一些变量,然后我们将对这些变量执行一些操作。然后,当在输出中显示结果时,我们将分析程序每一行的内存使用情况。让我们看以下示例程序来理解 memory-profiler 模块的此实现部分。

示例 1

输出

Filename: C:\Users\Manish\memoryexample.py

Line #    Mem usage    Increment    Occurences    Line Contents
============================================================
  4      40.2 MiB      40.2 MiB     1            @profile
  5                                              # a default function to check memory usage
  6                                                  def defFunc():
  7                                              # Some random variables
  8      40.2 MiB      0.0 MiB      1            var1 = [1] * (6 ** 4)
  9      40.2 MiB      0.0 MiB      1            var2 = [1] * (2 ** 3)
  10     40.2 MiB      0.0 MiB      1            var3 = [2] * (4 * 6 ** 3)
  11                                             # Operations on variable
  12     40.2 MiB      0.0 MiB      1            del var3
  13     40.2 MiB      0.0 MiB      1            del var1
  14     40.2 MiB      0.0 MiB      1            return var2
We have successfully inspected memory usage from the default functi

如我们所见,程序每一行的内存使用情况都随最后的确认语句一起显示。

说明

我们首先从 memory-profiler 模块导入了 profile 装饰器类。之后,我们使用了 profile 装饰器,然后我们定义了一个名为 'defFunc' 的默认函数。在该默认函数中,我们定义了三个变量,然后我们删除了第一个和第三个变量,并从函数返回了第二个变量。然后,我们调用了默认函数,之后,我们使用了一个打印语句作为确认消息。

在上述示例的输出中,我们可以看到多个列,它们表示定义在下面的多个属性:

  1. Line #: 此列表示程序中显示内存使用情况的行号
  2. Mem Usage: 此列表示在整个执行过程中,直到代码的特定行所使用的内存或 RAM
  3. Increment: 此列显示与前一行代码相比,当前行内存使用情况的差异,或者我们可以说它基本上显示了
  4. Occurences: 此行显示与该特定行号对应的代码执行的次数
  5. Line Contents: 它表示该特定行中编写的 Python 代码

因此,这就是我们如何理解 Python 程序以及程序中特定行的内存使用情况的分析,以便我们知道该函数或代码行如何影响性能和执行时间。

实现 2:分析执行过程中的内存使用情况

此实现部分将涵盖 memory-profiler 模块在监控和分析 Python 程序内存使用情况方面的实际实现。在此实现部分,我们首先创建一个 Python 文件并包含以下示例程序:

示例 2

在编写完上述程序后,我们将文件保存为 **“memoryexample”** 名称,现在我们将创建另一个文件,在该文件中我们将导入此文件并在此文件中编写以下 Python 程序:

现在,我们完成了程序编写部分,当我们运行第二个文件时,我们将看到以下 **输出:**

Filename: C:\Users\Manish\memoryexample.py

Line #    Mem usage    Increment    Occurences    Line Contents
============================================================
  17     44.6 MiB     44.6 MiB           1   	@profile
  18                                            def parseURL(self, url):
  19                                            # fetches the response
  20     51.9 MiB      7.3 MiB           1   	response = requests.get(url).text
  21     51.9 MiB      0.0 MiB           1   	with open('url.txt', 'w') as sampleFile:
  22                                         			
  23                                            # writing response to file
  24     52.5 MiB      0.6 MiB           1   	sampleFile.writelines(response)


Filename: C:\Users\Manish\memoryexample.py

Line #    Mem usage    Increment    Occurences    Line Contents
============================================================
  8      47.9 MiB      47.9 MiB       1   	     @profile
  9                                            # Default function for parsing words from list
  10                                         	 def parseList(self, array):
  11                                           # Creating a file type object
  12     47.9 MiB      0.0 MiB       1   	     sampleFile = open('wordParsing.txt', 'w')
  13                                           # looping over the file
  14     47.9 MiB      0.0 MiB       6   	     for parsedWords in array:
  15                                           # Writing words in the example file
  16     47.9 MiB      0.0 MiB       5   	     sampleFile.writelines(parsedWords)

[Finished in 27.1s]

在输出中,我们可以看到执行过程中以及从文件和 URL 中提取单词的总内存使用情况。这就是我们如何分析和理解程序的内存使用情况以及它如何影响程序的性能和执行速度。