Python内存分析器模块
我们或许都听说过应用程序的处理速度慢或执行速度慢,但我们有没有试图理解其原因呢?应用程序处理或执行命令所花费的时间可能有一种可能原因,但内存使用情况呢?系统的内存或内存对于应用程序的处理和执行时间非常重要,但实际上很少有人谈论它。执行或处理命令时使用的内存(RAM)的大小也会影响应用程序的执行速度。虽然这听起来对我们来说可能是荒谬或无关紧要的,但它在系统性能和安装在其中的应用程序的性能中起着非常重要的作用。因此,通常情况下,RAM较少的应用程序与RAM较多的应用程序相比,执行时间较长。
执行程序时同样适用相同的情况,因此查看执行程序时使用多少内存非常重要。这将帮助我们管理内存使用情况或更好地设计程序,并考虑内存使用情况。但是现在,我们会有一些问题,比如如何做到这一点,如何跟踪程序的内存使用情况,或者如何找出程序的哪些函数使用了更多的内存并使其执行变慢?Python中有一个内存分析模块,它可以帮助我们跟踪程序及其函数使用的内存。在本教程中,我们将学习Python的内存分析模块,并学习如何使用该模块在执行程序时跟踪使用了多少RAM。
Python内存分析器模块简介
内存分析器是一个开源的Python模块,它为我们提供了在程序执行期间跟踪内存消耗的功能,我们甚至可以通过对程序及其函数进行逐行分析来监视内存消耗。内存分析器模块还帮助我们分析Python的性能以及在执行期间RAM的消耗对性能和执行速度的影响。在这里,我们将讨论内存分析器模块的安装和实施,并借助示例程序来使用该模块,但首先,我们将了解该模块的优势和特点。
Python内存分析器模块:优势和特点
我们中的大多数人可能会听说Python相对其他编程语言较慢,并且执行程序或应用程序需要更长的时间。好吧,如果我们问他们计算执行速度的方法是什么,我们将首先收到的答案是Python执行代码或代码部分所花费的总时间,或者类似于这样的东西。但我们将看到他们中没有人会提到执行该特定代码部分时使用了多少RAM或内存。关于程序的执行速度,这似乎是非常微不足道的信息,但实际上,它对于影响Python执行程序的速度非常重要。因此,分析程序执行过程中的内存使用情况同样重要,这得益于Python的内存分析器模块。Python的内存分析器模块具有以下关于监视和分析程序执行期间内存使用情况的特点和优势:
- 该模块帮助我们跟踪Python程序在执行期间使用的内存消耗,以便我们可以了解性能和速度的原因
- 我们甚至可以通过内存分析器模块跟踪程序的特定部分的内存使用情况
- 我们甚至可以监控程序逐行消耗的内存
这些是使用memory-profiler模块的一些优势,它还可以帮助我们改善Python的性能。
Python的memory-profiler模块:安装
Python的memory-profiler模块不是内置模块,所以如果我们想要了解它的实现并在开发过程中使用它,我们必须在系统中安装该模块或确保该模块已正确安装在我们的系统中。如果我们的系统中没有memory-profiler,我们可以通过各种方法安装它,但我们可以选择的最简单的方式是通过pip安装程序进行安装。因此,在这个安装部分,我们将使用以下命令通过pip安装程序安装memory-profiler模块:
pip install memory-profiler
首先,我们必须在命令提示符终端窗口中输入上述命令,然后按下“回车”键开始安装过程。一旦安装过程开始,它将花费一些时间,并且我们必须等待直到它成功安装在我们的系统中。
如我们所见,内存分析器已成功安装在我们的系统中,现在我们可以继续使用它的实现,并且我们现在甚至可以将这个模块用于开发目的。
注意:在本教程的实现部分中,我们将在一个示例程序中使用请求模块和内存分析器模块,以理解内存追踪和分析的真实应用和用法。因此,在我们继续实现部分之前,我们应该确保请求模块存在于我们的系统中,如果它没有存在于我们的系统中,我们可以使用以下pip命令从pip安装程序中安装它:
pip install requests
如我们所见,requests模块已经存在于我们的系统中,因此会显示一个满足要求的消息。
Python的memory-profiler模块:实现
我们将使用两个示例来了解memory-profiler模块的实现,并分析程序在输出中显示结果时的内存使用情况。让我们来看以下两个示例程序,以了解memory-profiler模块的实现:
实现1:从默认函数中分析内存使用情况:
在这个实现部分中,我们将在示例程序中创建一个默认函数,并在其中定义一些变量,然后对这些变量执行一些操作。然后,当结果在输出中显示时,我们将分析程序每一行的内存使用情况。让我们看下面的示例程序,以了解memory-profiler模块的这个实现部分。
示例1:
# Importing memory-profiler module in the program
from memory_profiler import profile
# Profile Decorator class
@profile
# A default function to check memory usage
def defFunc():
# Some random variables
var1 = [1] * (6 ** 4)
var2 = [1] * (2 ** 3)
var3 = [2] * (4 * 6 ** 3)
# Operations on variable
del var3
del var1
return var2
if __name__ == '__main__':
# Calling default function
defFunc()
# Print confirmation message
print("We have successfully inspected memory usage from the default function!")
输出:
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 装饰器类。然后,我们使用了该装饰器,并定义了一个名为 ‘defFunc’ 的默认函数。在这个默认函数内部,我们定义了三个变量,然后删除了第一个和第三个变量,并从函数中返回了第二个变量。然后,我们调用了默认函数,并使用了一个打印语句作为确认消息。
在上述示例的输出中,我们可以看到表示多个属性的多列,这些属性如下所述:
- 行号(Line #): 该列表示显示了程序的内存使用情况的行号
- 内存使用情况(Mem Usage): 该列表示在整个执行过程中,到达代码的特定行时所使用的内存或 RAM
- 增量(Increment): 该列显示了当前行与前一行代码的内存使用情况之间的差异,或者我们可以说它基本上显示了
- 出现次数(Occurences): 该行显示了针对特定行号的代码执行了多少次
- 行内容(Line Contents): 它表示在该特定行中编写的 Python 代码
这就是我们如何了解 Python 程序以及特定行在程序中的内存使用情况分析,以便我们知道这个函数或代码行是如何影响性能和执行时间的。
实现2:分析执行过程中的内存使用情况:
这个实现部分将涵盖 memory-profiler 模块的实际使用方式,用于监控和分析 Python 程序的内存使用情况。在这个实现部分中,首先,我们将创建一个具有以下示例程序的 Python 文件:
示例2:
# Import memory_profiler module
from memory_profiler import profile
# Importing request module in the program
import requests
# Creating a base extractor class
class baseExtr:
# Using profile decorator for monitoring memory usage
@profile
# Default function for parsing words from list
def parseList(self, array):
# Creating a file type object in the system
sampleFile = open('wordParsing.txt', 'w')
# Looping over the file with for loop
for parsedWords in array:
# Writing words in the example file
sampleFile.writelines(parsedWords)
@profile
# Another default function for fetching URL
def parseURL(self, url):
# Fetching response from the file
response = requests.get(url).text
with open('url.txt', 'w') as sampleFile:
# Writing fetched responses in the example file
sampleFile.writelines(response)
在编写以上给出的程序之后,我们将使用 ‘memoryexample’ 为文件命名,并且现在我们将创建另一个文件,其中我们将导入该文件并在其中编写以下Python程序:
# Import baseExtr class from memoryexample file
from memoryexample import baseExtr
if __name__ == "__main__":
# Git URL for importing word list
url = 'https://raw.githubusercontent.com/dwyl/english-words/master/words.txt'
# Array for word from text file
array = ['five', 'four', 'three', 'two', 'one']
# Initializing Extractor object from baseExtr() class
wordExtract = baseExtr()
# Calling parseURL() function from baseExtr class
wordExtract.parseURL(url)
# Calling out pasreList() function
wordExtract.parseList(array)
现在,我们已经完成了程序编写部分,当我们运行第二个文件时,我们将看到以下 输出:
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中提取单词的过程在输出中显示。这就是我们可以分析和了解程序的内存使用情况以及它如何影响程序的性能和执行速度的方法。