最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中內(nèi)存監(jiān)控的三種實現(xiàn)方法介紹

 更新時間:2025年02月10日 10:00:00   作者:ftpeak  
在?Python?開發(fā)中,對內(nèi)存使用情況進(jìn)行監(jiān)控是一項至關(guān)重要的任務(wù),本文為大家整理了三種常用的內(nèi)存監(jiān)控方法的實現(xiàn)與對比,有需要的可以了解下

在 Python 開發(fā)中,對內(nèi)存使用情況進(jìn)行監(jiān)控是一項至關(guān)重要的任務(wù)。無論是開發(fā)小型腳本還是大型應(yīng)用程序,不合理的內(nèi)存使用都可能導(dǎo)致性能下降,甚至引發(fā)程序崩潰。本文將詳細(xì)介紹幾種常見的 Python 內(nèi)存監(jiān)控方法,包括 psutil 庫、memory_profiler 庫以及 tracemalloc 模塊,并對它們進(jìn)行對比分析,同時說明各自的應(yīng)用場景。

1. 使用 psutil 庫監(jiān)控內(nèi)存

1.1 簡介與安裝

psutil(Process and System Utilities)是一個跨平臺的庫,它提供了豐富的系統(tǒng)信息獲取功能,包括 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等。借助 psutil,我們可以方便地監(jiān)控系統(tǒng)和進(jìn)程的內(nèi)存使用情況。

安裝 psutil 非常簡單,只需在命令行中運(yùn)行以下命令:

pip install psutil

1.2 示例代碼與功能實現(xiàn)

import psutil
 
# 獲取系統(tǒng)的內(nèi)存使用情況
def get_system_memory_usage():
    """
    獲取并打印系統(tǒng)的內(nèi)存使用情況。
    該函數(shù)使用psutil庫來獲取系統(tǒng)的虛擬內(nèi)存信息,包括總內(nèi)存、已使用內(nèi)存、空閑內(nèi)存和內(nèi)存使用率。
    所有內(nèi)存值都轉(zhuǎn)換為GB并保留兩位小數(shù)。
    """
    memory = psutil.virtual_memory()
    total = memory.total / (1024 ** 3)  # 轉(zhuǎn)換為 GB
    used = memory.used / (1024 ** 3)    # 轉(zhuǎn)換為 GB
    free = memory.free / (1024 ** 3)    # 轉(zhuǎn)換為 GB
    percent = memory.percent
    print(f"總內(nèi)存: {total:.2f} GB")
    print(f"已使用內(nèi)存: {used:.2f} GB")
    print(f"空閑內(nèi)存: {free:.2f} GB")
    print(f"內(nèi)存使用率: {percent}%")
 
# 獲取當(dāng)前進(jìn)程的內(nèi)存使用情況
def get_process_memory_usage():
    """
    獲取并打印當(dāng)前進(jìn)程的內(nèi)存使用情況。
    該函數(shù)使用psutil庫來獲取當(dāng)前進(jìn)程的內(nèi)存信息,具體是駐留集大?。≧SS),并將其轉(zhuǎn)換為MB并保留兩位小數(shù)。
    """
    process = psutil.Process()
    memory_info = process.memory_info()
    rss = memory_info.rss / (1024 ** 2)  # 轉(zhuǎn)換為 MB
    print(f"當(dāng)前進(jìn)程的駐留集大?。≧SS): {rss:.2f} MB")
 
if __name__ == "__main__":
    """
    主程序入口。
    當(dāng)腳本直接運(yùn)行時,調(diào)用get_system_memory_usage和get_process_memory_usage函數(shù)來獲取并打印系統(tǒng)和當(dāng)前進(jìn)程的內(nèi)存使用情況。
    """
    print("系統(tǒng)內(nèi)存使用情況:")
    get_system_memory_usage()
    print("\n當(dāng)前進(jìn)程內(nèi)存使用情況:")
    get_process_memory_usage()

在上述代碼中,get_system_memory_usage 函數(shù)通過 psutil.virtual_memory() 獲取系統(tǒng)的內(nèi)存信息,包括總內(nèi)存、已使用內(nèi)存、空閑內(nèi)存和內(nèi)存使用率。get_process_memory_usage 函數(shù)則使用 psutil.Process() 獲取當(dāng)前進(jìn)程,并通過 memory_info() 方法獲取進(jìn)程的內(nèi)存信息,這里主要關(guān)注駐留集大?。≧SS),也就是當(dāng)前進(jìn)程的內(nèi)存消耗。

執(zhí)行結(jié)果如下:

C:\Users\gyfin\.conda\envs\pa001\python.exe D:\pyproject\pa001\AAP01\test6.py 
系統(tǒng)內(nèi)存使用情況:
總內(nèi)存: 7.92 GB
已使用內(nèi)存: 6.32 GB
空閑內(nèi)存: 1.60 GB
內(nèi)存使用率: 79.8%
 
當(dāng)前進(jìn)程內(nèi)存使用情況:
當(dāng)前進(jìn)程的駐留集大小(RSS): 15.12 MB
 
進(jìn)程已結(jié)束,退出代碼為 0

1.3 應(yīng)用場景

系統(tǒng)級監(jiān)控:當(dāng)你需要對整個系統(tǒng)的內(nèi)存使用情況進(jìn)行監(jiān)控時,psutil 是一個很好的選擇。例如,在服務(wù)器環(huán)境中,定期監(jiān)控系統(tǒng)內(nèi)存使用情況,以便及時發(fā)現(xiàn)內(nèi)存不足的問題并采取相應(yīng)的措施,如優(yōu)化程序或增加物理內(nèi)存。

進(jìn)程級監(jiān)控:對于多進(jìn)程的 Python 應(yīng)用程序,你可以使用 psutil 監(jiān)控每個進(jìn)程的內(nèi)存使用情況,找出內(nèi)存占用過高的進(jìn)程,進(jìn)行針對性的優(yōu)化。 

2. 使用 memory_profiler 庫監(jiān)控內(nèi)存

2.1 簡介與安裝

memory_profiler 是一個專門用于監(jiān)控 Python 函數(shù)內(nèi)存使用情況的庫。它可以逐行分析函數(shù)的內(nèi)存使用情況,幫助我們精確地找出內(nèi)存分配的關(guān)鍵代碼行。

安裝 memory_profiler 同樣可以使用 pip 命令:

pip install memory_profiler

2.2 示例代碼與功能實現(xiàn)

from memory_profiler import profile
 
# 使用memory_profiler庫的profile裝飾器來監(jiān)控函數(shù)的內(nèi)存使用情況
@profile
def test_function():
    """
    測試函數(shù),用于生成一個包含100萬個整數(shù)的列表,并在使用后刪除該列表。
    該函數(shù)使用列表推導(dǎo)式生成一個包含100萬個整數(shù)的列表,然后刪除該列表以釋放內(nèi)存。
    """
    # 使用列表推導(dǎo)式生成一個包含100萬個整數(shù)的列表
    data = [i for i in range(1000000)]
    # 刪除列表以釋放內(nèi)存
    del data
    # 函數(shù)返回
    return
 
if __name__ == "__main__":
    """
    主程序入口。
    當(dāng)腳本直接運(yùn)行時,調(diào)用test_function函數(shù)來測試內(nèi)存使用情況。
    """
    # 調(diào)用test_function函數(shù)
    test_function()

在上述代碼中,我們使用 @profile 裝飾器來標(biāo)記需要監(jiān)控的函數(shù) test_function。需要注意的是,運(yùn)行該代碼時,需要使用 python -m memory_profiler your_script.py 命令,這樣才能看到詳細(xì)的內(nèi)存使用分析。

程序執(zhí)行結(jié)果如下:

(pa001) D:\pyproject\pa001\AAP01>python -m memory_profiler test6.py
Filename: test6.py
 
Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
     3     50.1 MiB     50.1 MiB           1   @profile
     4                                         def test_function():
     5     88.5 MiB     35.0 MiB     1000003       data = [i for i in range(1000000)]
     6     50.8 MiB    -37.7 MiB           1       del data
     7     50.8 MiB      0.0 MiB           1       return
 

2.3 應(yīng)用場景

函數(shù)級內(nèi)存分析:當(dāng)你懷疑某個函數(shù)存在內(nèi)存泄漏或內(nèi)存使用不合理的問題時,memory_profiler 可以幫助你逐行分析該函數(shù)的內(nèi)存使用情況,找出內(nèi)存分配和釋放的關(guān)鍵代碼行,從而進(jìn)行針對性的優(yōu)化。

算法優(yōu)化:在開發(fā)算法時,你可以使用 memory_profiler 監(jiān)控不同算法實現(xiàn)的內(nèi)存使用情況,選擇內(nèi)存效率更高的算法。

3. 使用 tracemalloc 模塊監(jiān)控內(nèi)存

3.1 簡介與使用

tracemalloc 是 Python 標(biāo)準(zhǔn)庫中的一個模塊,可用于跟蹤內(nèi)存分配。它可以統(tǒng)計內(nèi)存分配的大小、數(shù)量,并找出內(nèi)存分配最多的代碼行。

3.2 示例代碼與功能實現(xiàn)

# 導(dǎo)入 tracemalloc 模塊,用于跟蹤內(nèi)存分配
import tracemalloc
 
# 啟動 tracemalloc 跟蹤
tracemalloc.start()
 
# 模擬一些內(nèi)存分配操作,創(chuàng)建一個包含100萬個整數(shù)的列表
data = [i for i in range(1000000)]
 
# 獲取當(dāng)前內(nèi)存分配的快照
snapshot = tracemalloc.take_snapshot()
# 統(tǒng)計內(nèi)存分配的前10個位置
top_stats = snapshot.statistics('lineno')
 
# 打印標(biāo)題
print("[ Top 10 ]")
# 遍歷并打印前10個內(nèi)存分配位置的統(tǒng)計信息
for stat in top_stats[:10]:
    print(stat)
 
# 清理內(nèi)存,刪除列表
del data

在上述代碼中,tracemalloc.start() 用于啟動內(nèi)存跟蹤,tracemalloc.take_snapshot() 用于獲取當(dāng)前的內(nèi)存分配快照,最后通過 snapshot.statistics('lineno') 可以按行統(tǒng)計內(nèi)存分配情況,并打印出內(nèi)存分配最多的前 10 行代碼的信息。

執(zhí)行結(jié)果如下:

C:\Users\gyfin\.conda\envs\pa001\python.exe D:\pyproject\pa001\AAP01\test7.py 
[ Top 10 ]
D:\pyproject\pa001\AAP01\test7.py:6: size=38.6 MiB, count=999745, average=40 B
 
進(jìn)程已結(jié)束,退出代碼為 0

3.3 應(yīng)用場景

內(nèi)存泄漏檢測:tracemalloc 可以幫助我們找出程序中可能存在的內(nèi)存泄漏問題。通過定期獲取內(nèi)存分配快照并進(jìn)行比較,我們可以發(fā)現(xiàn)哪些對象的內(nèi)存沒有被正確釋放,從而定位內(nèi)存泄漏的位置。

性能優(yōu)化:在優(yōu)化程序性能時,我們可以使用 tracemalloc 找出內(nèi)存分配熱點(diǎn),即內(nèi)存分配最多的代碼行,然后對這些代碼進(jìn)行優(yōu)化,減少不必要的內(nèi)存分配。

4. 方法對比

4.1 功能對比

psutil 主要用于獲取系統(tǒng)和進(jìn)程的整體內(nèi)存使用情況,側(cè)重于宏觀層面的監(jiān)控。它可以方便地獲取系統(tǒng)總內(nèi)存、已使用內(nèi)存、空閑內(nèi)存以及進(jìn)程的駐留集大小等信息。

memory_profiler 專注于函數(shù)級別的內(nèi)存分析,能夠逐行顯示函數(shù)的內(nèi)存使用情況,幫助我們精確地找出內(nèi)存分配的關(guān)鍵代碼行。

tracemalloc 則側(cè)重于內(nèi)存分配的跟蹤和統(tǒng)計,它可以統(tǒng)計內(nèi)存分配的大小、數(shù)量,并找出內(nèi)存分配最多的代碼行,對于檢測內(nèi)存泄漏和優(yōu)化內(nèi)存使用非常有幫助。

4.2 使用復(fù)雜度對比

psutil 的使用相對簡單,只需要調(diào)用幾個簡單的函數(shù)即可獲取系統(tǒng)和進(jìn)程的內(nèi)存信息。

memory_profiler 需要使用裝飾器來標(biāo)記需要監(jiān)控的函數(shù),并且運(yùn)行時需要使用特定的命令,使用起來稍微復(fù)雜一些。

tracemalloc 是 Python 標(biāo)準(zhǔn)庫的一部分,使用時只需要調(diào)用幾個函數(shù)即可啟動和獲取內(nèi)存分配快照,但分析結(jié)果可能需要一定的經(jīng)驗來解讀。

4.3 性能開銷對比

psutil 的性能開銷相對較小,因為它主要是從系統(tǒng)層面獲取內(nèi)存信息,不會對程序的正常運(yùn)行產(chǎn)生太大影響。

memory_profiler 的性能開銷相對較大,因為它需要逐行分析函數(shù)的內(nèi)存使用情況,會對程序的運(yùn)行速度產(chǎn)生一定的影響。

tracemalloc 的性能開銷也比較大,尤其是在內(nèi)存分配頻繁的情況下,因為它需要跟蹤每一次內(nèi)存分配操作。

總結(jié)

在 Python 中,psutil、memory_profiler 和 tracemalloc 都可以用于內(nèi)存監(jiān)控,但它們的功能和應(yīng)用場景有所不同。如果你需要監(jiān)控系統(tǒng)和進(jìn)程的整體內(nèi)存使用情況,建議使用 psutil;如果你需要對函數(shù)進(jìn)行逐行的內(nèi)存分析,memory_profiler 是一個不錯的選擇;如果你需要檢測內(nèi)存泄漏和優(yōu)化內(nèi)存使用,tracemalloc 會更適合你。在實際應(yīng)用中,你可以根據(jù)具體的需求選擇合適的方法,或者結(jié)合使用多種方法來全面監(jiān)控和優(yōu)化程序的內(nèi)存使用情況。

到此這篇關(guān)于Python中內(nèi)存監(jiān)控的三種實現(xiàn)方法介紹的文章就介紹到這了,更多相關(guān)Python內(nèi)存監(jiān)控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python基于smtplib協(xié)議實現(xiàn)發(fā)送郵件

    Python基于smtplib協(xié)議實現(xiàn)發(fā)送郵件

    這篇文章主要介紹了Python基于smtplib協(xié)議實現(xiàn)發(fā)送郵件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • django創(chuàng)建簡單的頁面響應(yīng)實例教程

    django創(chuàng)建簡單的頁面響應(yīng)實例教程

    這篇文章主要給大家介紹了關(guān)于django如何創(chuàng)建簡單的頁面響應(yīng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python實現(xiàn)將JPG、BMP圖片轉(zhuǎn)化為bgr

    python實現(xiàn)將JPG、BMP圖片轉(zhuǎn)化為bgr

    這篇文章主要介紹了python實現(xiàn)將JPG、BMP圖片轉(zhuǎn)化為bgr方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Python List remove()實例用法詳解

    Python List remove()實例用法詳解

    在本篇內(nèi)容里小編給大家整理了一篇關(guān)于Python List remove()方法及實例,有需要的朋友們跟著學(xué)習(xí)下。
    2021-08-08
  • python字典按照value排序方法

    python字典按照value排序方法

    在本篇文章里小編給各位分享一篇關(guān)于python字典按照value排序方法的相關(guān)文章,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Python爬蟲實現(xiàn)百度圖片自動下載

    Python爬蟲實現(xiàn)百度圖片自動下載

    這篇文章主要介紹了Python爬蟲實現(xiàn)百度圖片自動下載的方法以及相關(guān)代碼分析,對此有興趣的朋友參考下。
    2018-02-02
  • Python按條件篩選、剔除表格數(shù)據(jù)并繪制剔除前后的直方圖(示例代碼)

    Python按條件篩選、剔除表格數(shù)據(jù)并繪制剔除前后的直方圖(示例代碼)

    本文介紹基于Python語言,讀取Excel表格文件數(shù)據(jù),以其中某一列數(shù)據(jù)的值為標(biāo)準(zhǔn),對于這一列數(shù)據(jù)處于指定范圍的所有行,再用其他幾列數(shù)據(jù)的數(shù)值,加以數(shù)據(jù)篩選與剔除,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 使用Python輕松管理Word頁腳

    使用Python輕松管理Word頁腳

    在日常的辦公自動化中,處理Word文檔是許多人繞不開的環(huán)節(jié),本文將深入探討如何利用Python以編程方式為Word文檔添加、定制和管理頁腳,感興趣的小伙伴可以了解下
    2026-01-01
  • 使用AJAX和Django獲取數(shù)據(jù)的方法實例

    使用AJAX和Django獲取數(shù)據(jù)的方法實例

    這篇文章主要給大家介紹了關(guān)于使用AJAX和Django獲取數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python寫入文件如何取消自動換行

    python寫入文件如何取消自動換行

    這篇文章主要介紹了python寫入文件如何取消自動換行問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論

鄄城县| 鹰潭市| 新泰市| 长治市| 长宁区| 正宁县| 桃源县| 池州市| 鸡东县| 勃利县| 玛多县| 凤城市| 扎囊县| 邹平县| 陇南市| 大丰市| 玛纳斯县| 山阳县| 乌兰县| 永和县| 逊克县| 静安区| 德化县| 庐江县| 康定县| 栾城县| 蓬安县| 云和县| 抚州市| 淮南市| 阿鲁科尔沁旗| 江安县| 东兰县| 沛县| 响水县| 山东| 聂荣县| 安康市| 万源市| 安徽省| 曲靖市|