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

Python?tracemalloc跟蹤內(nèi)存分配問(wèn)題

 更新時(shí)間:2023年11月09日 09:18:44   作者:Rnan-prince  
這篇文章主要介紹了Python?tracemalloc跟蹤內(nèi)存分配問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Python tracemalloc跟蹤內(nèi)存分配

tracemalloc 模塊是一個(gè)用于對(duì) python 已申請(qǐng)的內(nèi)存塊進(jìn)行debug的工具。

它能提供以下信息:

  • 定位對(duì)象分配內(nèi)存的位置
  • 文件、按行統(tǒng)計(jì)python的內(nèi)存塊分配情況: 總大小、塊的數(shù)量以及塊平均大小。
  • 對(duì)比兩個(gè)內(nèi)存快照的差異,以便排查內(nèi)存泄漏

顯示前10項(xiàng)

顯示內(nèi)存分配最多的10個(gè)文件:

import tracemalloc
 
tracemalloc.start()
# --- 業(yè)務(wù)代碼 start ---
n = 10000000
s = 0
for i in range(1, n):
    s *= i
# --- 業(yè)務(wù)代碼 end ---
snapshot = tracemalloc.take_snapshot()  # 內(nèi)存攝像
top_stats = snapshot.statistics('lineno')  # 內(nèi)存占用數(shù)據(jù)獲取
 
print('[Top 10]')
for stat in top_stats[:10]:  # 打印占用內(nèi)存最大的10個(gè)子進(jìn)程
    print(stat)
 
# [Top 10]
# D:/MyPython/tracemalloc/demo.py:5: size=576 B, count=1, average=576 B
# D:/MyPython/tracemalloc/demo.py:7: size=28 B, count=1, average=28 B

TOP1:代碼第五行占用內(nèi)存大小576B

計(jì)算差異

獲取兩個(gè)快照并顯示差異:

import tracemalloc
 
 
tracemalloc.start()
snapshot0 = tracemalloc.take_snapshot()  # 第一張快照
# --- 業(yè)務(wù)代碼 start ---
n = 10000000
s = 0
for i in range(1, n):
    s *= i
# --- 業(yè)務(wù)代碼 end ---
snapshot1 = tracemalloc.take_snapshot()  # 第二張快照
top_stats = snapshot1.compare_to(snapshot0, 'lineno')  # 快照對(duì)比
 
print('[Top 10 differences]')
for stat in top_stats[:10]:
    print(stat)
 
# [Top 10 differences]
# D:/MyPython/tracemalloc/demo.py:27: size=576 B (+576 B), count=1 (+1), average=576 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:397: size=88 B (+88 B), count=2 (+2), average=44 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:534: size=48 B (+48 B), count=1 (+1), average=48 B
# D:\Program Files\anaconda3\lib\tracemalloc.py:291: size=40 B (+40 B), count=1 (+1), average=40 B
# D:/MyPython/tracemalloc/demo.py:31: size=28 B (+28 B), count=1 (+1), average=28 B

TOP1:代碼第27行占用內(nèi)存大小增加了576B

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

概述

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

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

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

查看gc引用對(duì)象總數(shù)

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

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

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

import gc

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

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

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

# 獲取運(yùn)行代碼后gc引用對(duì)象數(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引用的對(duì)象總數(shù)。

Before: 28834
After:  28923

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

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

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

下面是被測(cè)試代碼

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),用來(lái)表示這行代碼所分配的對(duì)象占用多少內(nèi)存,以及對(duì)象的數(shù)量。通過(guò)對(duì)比就能發(fā)現(xiàn)占用內(nèi)存較多的對(duì)象是由那幾行代碼分配的。

/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

2.查看棧信息

tracemalloc還可以打印棧的追蹤信息,下面把程序中分配內(nèi)存最多的那行代碼所對(duì)應(yīng)的棧追蹤信息打印出來(lái),看看程序是沿著哪條路徑觸發(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)文章

  • 一文搞懂Python的hasattr()、getattr()、setattr()?函數(shù)用法

    一文搞懂Python的hasattr()、getattr()、setattr()?函數(shù)用法

    python中的getattr()、setattr()、hasattr()函數(shù)均是對(duì)類(lèi)屬性或方法的操作,其中g(shù)etattr()用于獲取類(lèi)或?qū)嵗兄付ǚ椒ǐ@取屬性的值,setattr()用于設(shè)置類(lèi)或?qū)嵗袑傩曰蚍椒?hasattr()用于判斷類(lèi)或?qū)嵗惺欠翊嬖谥付ǖ膶傩曰蚍椒?本文通過(guò)例子給大家詳解,一起看看吧
    2022-04-04
  • Starship定制shell提示符實(shí)現(xiàn)信息自由

    Starship定制shell提示符實(shí)現(xiàn)信息自由

    這篇文章主要介紹了Starship定制shell提示符的實(shí)現(xiàn),讓你需要的所有信息觸手可及,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Python開(kāi)發(fā)工具PyCharm的下載與安裝步驟圖文教程

    Python開(kāi)發(fā)工具PyCharm的下載與安裝步驟圖文教程

    這篇文章主要為大家介紹了Python開(kāi)發(fā)工具PyCharm的下載與安裝步驟圖文教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 解決python logging遇到的坑 日志重復(fù)打印問(wèn)題

    解決python logging遇到的坑 日志重復(fù)打印問(wèn)題

    這篇文章主要介紹了解決python logging遇到的坑 日志重復(fù)打印問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python利用Pydub實(shí)現(xiàn)自動(dòng)分割音頻

    Python利用Pydub實(shí)現(xiàn)自動(dòng)分割音頻

    pydub是一個(gè)輕量級(jí)的音頻處理庫(kù),安裝方便,使用簡(jiǎn)單。而且pydub提供了豐富的音頻處理功能,包括切割、合并、轉(zhuǎn)換等。本文將利用Pydub實(shí)現(xiàn)自動(dòng)分割音頻功能,感興趣的可以了解一下
    2023-05-05
  • Python科學(xué)畫(huà)圖代碼分享

    Python科學(xué)畫(huà)圖代碼分享

    這篇文章主要介紹了Python科學(xué)畫(huà)圖代碼分享,涉及matplotlib庫(kù)的簡(jiǎn)單介紹,分享了matplotlib繪圖庫(kù)書(shū)籍的下載地址,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Python大數(shù)據(jù)之網(wǎng)絡(luò)爬蟲(chóng)的post請(qǐng)求、get請(qǐng)求區(qū)別實(shí)例分析

    Python大數(shù)據(jù)之網(wǎng)絡(luò)爬蟲(chóng)的post請(qǐng)求、get請(qǐng)求區(qū)別實(shí)例分析

    這篇文章主要介紹了Python大數(shù)據(jù)之網(wǎng)絡(luò)爬蟲(chóng)的post請(qǐng)求、get請(qǐng)求區(qū)別,結(jié)合具體實(shí)例形式分析了Python網(wǎng)頁(yè)爬蟲(chóng)post請(qǐng)求與get請(qǐng)求相關(guān)使用技巧,需要的朋友可以參考下
    2019-11-11
  • Python 中 sorted 如何自定義比較邏輯

    Python 中 sorted 如何自定義比較邏輯

    這篇文章主要介紹了Python中sorted如何自定義比較邏輯,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python遇到UnicodeEncodeError錯(cuò)誤的解決方案

    Python遇到UnicodeEncodeError錯(cuò)誤的解決方案

    在使用Python處理從不同網(wǎng)頁(yè)抓取的文本時(shí),經(jīng)常會(huì)遇到UnicodeEncodeError錯(cuò)誤,這通常是因?yàn)镻ython默認(rèn)使用ASCII編碼,而當(dāng)遇到超出ASCII編碼范圍(0 - 127)的字符時(shí),就會(huì)拋出該錯(cuò)誤,所以本文給大家介紹了一些Python遇到UnicodeEncodeError錯(cuò)誤的解決方案
    2025-06-06
  • django執(zhí)行原始查詢sql,并返回Dict字典例子

    django執(zhí)行原始查詢sql,并返回Dict字典例子

    這篇文章主要介紹了django執(zhí)行原始查詢sql,并返回Dict字典例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04

最新評(píng)論

勃利县| 手机| 平南县| 石景山区| 阳新县| 仪陇县| 改则县| 常熟市| 涿鹿县| 搜索| 连山| 沂南县| 芜湖市| 濮阳县| 图们市| 辽阳市| 米脂县| 潢川县| 肃宁县| 龙岩市| 霍州市| 雷波县| 左云县| 比如县| 定南县| 布尔津县| 凯里市| 独山县| 木里| 怀集县| 施甸县| 信丰县| 水富县| 内黄县| 中江县| 印江| 岱山县| 时尚| 庄河市| 信阳市| 罗田县|