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

tracemalloc分析內(nèi)存使用情況與泄露方式

 更新時(shí)間:2023年11月09日 17:29:26   作者:Bruce小鬼  
這篇文章主要介紹了tracemalloc分析內(nèi)存使用情況與泄露方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1.概述

python內(nèi)存管理是通過引用計(jì)數(shù)執(zhí)行的,如果指向某個(gè)對象的引用全部過期,那么受引用的對象就可以從內(nèi)存中清除,從而給其他數(shù)據(jù)騰出空間。

理論上講,python開發(fā)不用擔(dān)心程序如何分配和釋放內(nèi)存,因?yàn)閜ython系統(tǒng)本身以及Cpython運(yùn)行環(huán)境會自動處理這些問題。

但實(shí)際情況程序會因?yàn)闆]有及時(shí)釋放不再需要引用的數(shù)據(jù)耗盡內(nèi)存。下面通過一些方法來看下內(nèi)存使用情況。

2.查看gc引用對象總數(shù)

下面是被測試代碼,這個(gè)代碼可以創(chuàng)建對象,在gc中產(chǎn)生引用對象。

import os

class MyObject:
    def __init__(self):
        self.data = os.urandom(100)

def get_data():
    values = []
    for _ in range(100):
        obj = MyObject()
        values.append(obj)
    return values

def run():
    deep_values = []
    for _ in range(100):
        deep_values.append(get_data())
    return

下面的代碼用來輸出當(dāng)前gc引用對象的數(shù)量

import gc

# 獲取運(yùn)行前gc引用對象數(shù)量
found_objects = gc.get_objects()
print('Before:', len(found_objects))

# 導(dǎo)入待測試模塊
import waste_memory

# 運(yùn)行待測試代碼的函數(shù)
hold_reference = waste_memory.run()

# 獲取運(yùn)行代碼后gc引用對象數(shù)量
found_objects = gc.get_objects()
print('After: ', len(found_objects))
for obj in found_objects[:5]:
    print(repr(obj)[:100])

print('...')

運(yùn)行上面的代碼,下面是gc引用的對象總數(shù)。

Before: 28834
After:  28923

3.tracemalloc查看內(nèi)存分配情況

3.1.查看內(nèi)存分配情況

上面只輸出了gc的總數(shù),對于分析內(nèi)存分配情況沒有太多的指導(dǎo)意義,tracemalloc模塊能夠追溯到分配它的位置,因此我們可以在之前模塊前后對內(nèi)存使用情況做個(gè)快照,分析兩個(gè)快照之間的區(qū)別。

下面是被測試代碼

import tracemalloc

tracemalloc.start(10)                      # Set stack depth
time1 = tracemalloc.take_snapshot()        # Before snapshot

import waste_memory

x = waste_memory.run()                     # Usage to debug
time2 = tracemalloc.take_snapshot()        # After snapshot

stats = time2.compare_to(time1, 'lineno')  # Compare snapshots
for stat in stats[:3]:
    print(stat)

運(yùn)行上面的代碼,從結(jié)果中可以看出,每一條記錄都有size與count指標(biāo),用來表示這行代碼所分配的對象占用多少內(nèi)存,以及對象的數(shù)量。

通過對比就能發(fā)現(xiàn)占用內(nèi)存較多的對象是由那幾行代碼分配的。

/waste_memory.py:11: size=5120 B (+5120 B), count=80 (+80), average=64 B
/waste_memory.py:14: size=4424 B (+4424 B), count=79 (+79), average=56 B
/waste_memory.py:9: size=1704 B (+1704 B), count=8 (+8), average=213 B

3.2.查看棧信息

tracemalloc還可以打印棧的追蹤信息,下面把程序中分配內(nèi)存最多的那行代碼所對應(yīng)的棧追蹤信息打印出來,看看程序是沿著哪條路徑觸發(fā)這行代碼的。

import tracemalloc

tracemalloc.start(10)
time1 = tracemalloc.take_snapshot()

import waste_memory

x = waste_memory.run()
time2 = tracemalloc.take_snapshot()

stats = time2.compare_to(time1, 'traceback')
top = stats[0]
print('Biggest offender is:')
# 打印棧信息
print('\n'.join(top.traceback.format()))

運(yùn)行上面的代碼

Biggest offender is:
  File "/with_trace.py", line 14
    x = waste_memory.run()
  File "/waste_memory.py", line 23
    deep_values.append(get_data())
  File "/waste_memory.py", line 16
    obj = MyObject()
  File "/waste_memory.py", line 11
    self.data = os.urandom(100)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • pytorch 梯度NAN異常值的解決方案

    pytorch 梯度NAN異常值的解決方案

    這篇文章主要介紹了pytorch 梯度NAN異常值的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例

    Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例

    今天小編就為大家分享一篇Python將列表中的元素轉(zhuǎn)化為數(shù)字并排序的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python打印對象所有屬性和值的方法小結(jié)

    Python打印對象所有屬性和值的方法小結(jié)

    在Python開發(fā)過程中,調(diào)試代碼時(shí)經(jīng)常需要查看對象的當(dāng)前狀態(tài),也就是對象的所有屬性和對應(yīng)的值,然而,Python并沒有像PHP的print_r那樣直接提供一個(gè)內(nèi)置函數(shù)來實(shí)現(xiàn)這一功能,不過,Python提供了一些工具和方法,可以組合使用來達(dá)到打印對象屬性和值的目的,下面小編給大家講講
    2025-06-06
  • Python基于Streamlit實(shí)現(xiàn)音頻處理示例詳解

    Python基于Streamlit實(shí)現(xiàn)音頻處理示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何基于Streamlit實(shí)現(xiàn)的音頻處理,包含錄音,語音轉(zhuǎn)文本,文件下載和進(jìn)度顯示功能,有需要的小伙伴可以參考一下
    2025-03-03
  • Python2.7:使用Pyhook模塊監(jiān)聽鼠標(biāo)鍵盤事件-獲取坐標(biāo)實(shí)例

    Python2.7:使用Pyhook模塊監(jiān)聽鼠標(biāo)鍵盤事件-獲取坐標(biāo)實(shí)例

    這篇文章主要介紹了Python2.7:使用Pyhook模塊監(jiān)聽鼠標(biāo)鍵盤事件-獲取坐標(biāo)實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python中對FFmpeg封裝開發(fā)庫FFmpy詳解

    Python中對FFmpeg封裝開發(fā)庫FFmpy詳解

    這篇文章主要介紹了Python中對FFmpeg封裝開發(fā)庫FFmpy,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • 詳解python函數(shù)的閉包問題(內(nèi)部函數(shù)與外部函數(shù)詳述)

    詳解python函數(shù)的閉包問題(內(nèi)部函數(shù)與外部函數(shù)詳述)

    這篇文章主要介紹了python函數(shù)的閉包問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 如何利用Python分析出微信朋友男女統(tǒng)計(jì)圖

    如何利用Python分析出微信朋友男女統(tǒng)計(jì)圖

    這篇文章主要給大家介紹了關(guān)于如何利用Python分析出微信朋友男女統(tǒng)計(jì)圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2019-01-01
  • 在Pandas中使用透視表后去掉多級索引的方法

    在Pandas中使用透視表后去掉多級索引的方法

    Pandas是一個(gè)功能強(qiáng)大且通用的Python庫,用于數(shù)據(jù)操作和分析,它最有用的特性之一是數(shù)據(jù)透視表,它允許您重塑和匯總數(shù)據(jù),但是,使用數(shù)據(jù)透視表通常會導(dǎo)致多級(分層)索引,在本文中,我們將探討如何在Pandas中使用透視表后去掉多級索引,需要的朋友可以參考下
    2024-12-12
  • Python中pyCirclize包的使用教程詳解

    Python中pyCirclize包的使用教程詳解

    pyCirclize 是一個(gè) Python 包,用于繪制環(huán)形圖,這篇文章將將提供更豐富的示例代碼,以更全面地展示 pyCirclize 包的功能和用法,感興趣的小伙伴可以了解一下
    2023-11-11

最新評論

饶平县| 上蔡县| 明水县| 江源县| 平安县| 惠州市| 台东市| 新野县| 鄂温| 清苑县| 兴化市| 五常市| 射洪县| 平果县| 屯门区| 格尔木市| 河源市| 广南县| 光山县| 濉溪县| 斗六市| 神池县| 湛江市| 古蔺县| 饶平县| 宁蒗| 天峻县| 慈溪市| 曲靖市| 汾阳市| 金坛市| 兴安县| 公主岭市| 镇雄县| 泽普县| 阳谷县| 探索| 西华县| 桐梓县| 治多县| 桃园县|