我們都可能聽說過應用處理速度慢或執行速度慢,但我們有沒有試圖理解其背後的原因?應用花時間處理或執行我們的命令是有原因的,但是內存使用情況如何呢?系統的內存對於應用的處理和執行時間非常重要,但實際上沒有人談論它。執行或處理命令時使用了多少內存也會影響應用的執行速度。對我們來說,這可能聽起來很荒謬或微不足道,但它在我們的系統和安裝在其中的應用的性能中起著非常重要的作用。因此,與內存較多的應用相比,內存較少的應用執行時間較長是很常見的。
同樣的事情在執行程序時也適用,這就是為什麼在執行程序時查看使用了多少內存非常重要。這將幫助我們管理內存使用或以更好的方式設計程序,並記住內存使用。但是現在,一些問題會浮現在我們的腦海中,比如我們如何做到這一點,跟蹤程序的內存使用情況,或者找出程序的哪些功能使用了更多的內存,使其執行速度變慢?我們在 Python 中有一個內存分析模塊,它幫助我們跟蹤程序及其函數的內存使用情況。在本教程中,我們將學習 Python MemoryProfiler 模塊,我們將學習如何在執行程序時使用該模塊來跟蹤與分發一起使用的內存。
Python 內存剖析器模塊介紹
內存分析器是一個開源的 Python 模塊,它為我們提供了在程序執行時跟蹤程序內存消耗的功能,我們甚至可以通過程序中的逐行分析和程序的函數來監控內存消耗。MemoryProfiler 模塊還幫助我們分析 Python 的性能,以及其執行過程中內存消耗對性能和執行速度的影響。在這裡,我們將藉助示常式序討論 MemoryProfiler 模塊的安裝和實現,但首先,我們將了解該模塊的優勢和特性。
Python 內存剖析器模塊:優勢和特點
我們中的大多數人可能已經看到許多人抱怨 Python 與其他語言相比是一種緩慢的編程語言,執行一個程序或應用需要更多的時間。如果我們問他們使用什麼方法來計算執行速度,我們會得到的第一個答案是 Python 執行代碼或部分代碼或類似的東西所花費的總時間。但是我們會看到,他們都不會在執行代碼的特定部分時談論使用情況或使用了多少內存。關於程序的執行速度,這看起來似乎是非常無關緊要的信息,但實際上,這非常重要,它會影響 Python 執行程序的速度。因此,分析程序執行過程中的內存使用情況也同樣重要,因為 Python 的 MemoryProfiler 模塊,這成為可能。Python MemoryProfiler 模塊在監控和分析程序執行過程中的內存使用方面具有以下特點和優勢:
- 這個模塊幫助我們跟蹤 Python 程序在執行過程中的內存使用情況,這樣我們就可以知道性能和速度背後的原因
- 我們甚至可以在 MemoryProfiler 模塊的幫助下跟蹤程序特定部分的內存使用情況
- 我們甚至可以在程序執行時逐行監控它對內存的消耗
這些是使用 MemoryProfiler 模塊的一些優點,它也有助於我們提高 Python 的性能。
Python 的 MemoryProfiler 模塊:安裝
Python 的 memory-profiler Module 並不是一個內置的模塊,這就是為什麼如果我們想要了解它的實現並在開發過程中使用它,我們必須在我們的系統中安裝這個模塊,或者確保這個模塊在我們的系統中正確安裝。如果內存分析器不在我們的系統中,我們可以通過各種方法安裝它,但是我們可以選擇的最簡單的方法是通過 pip 安裝程序安裝它。因此,在本安裝部分,我們將使用以下命令通過 pip 安裝程序安裝 MemoryProfiler 模塊:
pip install memory-profiler
首先,我們必須在命令提示符終端 Shell 中寫入上面給出的命令,然後,我們必須按「enter」鍵開始安裝過程。一旦安裝過程開始,將需要一些時間,我們必須等到它成功安裝到我們的系統中。
正如我們所看到的,內存分析器已經成功地安裝在我們的系統中,現在我們可以進一步實現它,我們甚至可以將這個模塊用於開發目的。
注意:在本教程的實現部分,我們將在一個示常式序中使用帶有 MemoryProfiler 模塊的requests
模塊,以了解通過 MemoryProfiler 模塊進行內存跟蹤和分析的實際實現和使用。因此,在我們繼續執行實現部分之前,我們應該確保requests
模塊存在於我們的系統中,如果它不存在於我們的系統中,我們可以使用終端中的以下 pip 命令從 pip 安裝程序安裝它:
pip install requests
正如我們所看到的,requests
模塊已經存在於我們的系統中,這就是為什麼一個已經滿足的需求消息會顯示給我們。
Python 的 MemoryProfiler 模塊:實現
我們將在這裡使用兩個例子來理解 MemoryProfiler 模塊的實現,當結果顯示在輸出中時,我們將分析程序中的內存使用情況。讓我們看一下下面兩個示常式序,以了解 MemoryProfiler 模塊的實現:
實現 1:從默認函數分析內存使用情況:
在這個實現部分,我們將在示常式序中創建一個默認函數,並在其中定義一些變數,之後,我們將對這些變數執行一些操作。然後,當結果顯示在輸出中時,我們將分析程序每行的內存使用情況。讓我們看下面的示常式序來理解 MemoryProfiler 模塊的這個實現部分。
例 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
正如我們所看到的,程序每一行的內存使用情況都顯示在最後一行的確認語句中。
說明:
我們首先從程序中的內存剖析器模塊導入了概要文件裝飾器類。之後,我們使用了概要文件裝飾器,然後定義了一個名為「defFunc」的默認函數在這個默認函數中,我們定義了三個變數,然後刪除了第一個和第三個變數,並從函數中返回第二個變數。然後,我們調用了默認函數,之後,我們使用了像確認消息這樣的列印語句。
在上面示例的輸出中,我們可以看到多個列,這些列表示下面定義的多個屬性:
- 行號:此列表示顯示內存使用情況的程序的行號
- 內存使用:此列表示在整個執行過程中,直到特定代碼行為止所使用的內存或 RAM
- 增量:此列顯示當前行內存使用與前一行代碼相比的差異,或者我們可以看到它基本顯示
- 出現次數:該行顯示針對該特定行號的行代碼執行的次數
- 行內容:它表示在該特定行中編寫的 Python 代碼
因此,這就是我們如何理解 Python 程序甚至程序中特定行的內存使用分析,以便我們知道這個函數或代碼行是如何影響性能和執行時間的。
實現 2:分析執行過程中的內存使用情況:
這個實現部分將涵蓋 MemoryProfiler 模塊的實際實現,用於監控和分析 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)
寫完上面給出的程序後,我們將保存名稱為【內存示例】的文件,現在我們將創建另一個文件,我們將在其中導入該文件並在其中編寫以下 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 中提取單詞的過程。這就是我們如何分析和理解程序的內存使用情況,以及它如何影響程序的性能和執行速度。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/303006.html