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

Python中內(nèi)存管理機(jī)制與優(yōu)化技巧分享

 更新時(shí)間:2025年04月08日 10:24:43   作者:花小姐的春天  
這篇文章主要來(lái)和大家簡(jiǎn)單聊一聊Python中的內(nèi)存管理,從而可以幫助大家寫(xiě)出更高效,優(yōu)化內(nèi)存占用的 Python 代碼,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

還記得你第一次寫(xiě) Python 代碼的時(shí)候嗎?那種隨意創(chuàng)建變量、毫無(wú)節(jié)制地 new 一個(gè)又一個(gè)對(duì)象的快感,簡(jiǎn)直讓人沉迷!可是,當(dāng)代碼運(yùn)行變慢、內(nèi)存占用飆升時(shí),你才會(huì)意識(shí)到:

“誒?怎么 Python 還會(huì)吃這么多內(nèi)存?!”

今天,我們就來(lái)聊聊 Python 的內(nèi)存管理,幫你寫(xiě)出更高效、優(yōu)化內(nèi)存占用的 Python 代碼!

1. Python 的內(nèi)存管理機(jī)制

Python 內(nèi)部使用 引用計(jì)數(shù)(Reference Counting)垃圾回收(Garbage Collection, GC) 機(jī)制來(lái)管理內(nèi)存。

1.1 引用計(jì)數(shù)

每個(gè)對(duì)象都有一個(gè)“計(jì)數(shù)器”,記錄它被多少個(gè)變量引用。一旦引用計(jì)數(shù)歸零,Python 立刻釋放這個(gè)對(duì)象的內(nèi)存。

import sys

a = []  # 創(chuàng)建一個(gè)列表對(duì)象
print(sys.getrefcount(a))  # 輸出 2(因?yàn)?sys.getrefcount() 也會(huì)額外增加一次引用)

b = a  # 變量 b 也指向同一個(gè)列表
print(sys.getrefcount(a))  # 輸出 3

del a
print(sys.getrefcount(b))  # 輸出 2

del b  # 引用計(jì)數(shù)歸零,內(nèi)存被釋放

注意sys.getrefcount() 的結(jié)果比你想象的多 1,因?yàn)樗旧硪矔?huì)創(chuàng)建一個(gè)臨時(shí)引用!

1.2 垃圾回收(GC)

Python 采用 分代回收,對(duì)象被分成三代:新生代、中生代、老生代。垃圾回收主要針對(duì)循環(huán)引用的情況。

import gc

class A:
    def __init__(self):
        self.ref = None

obj1 = A()
obj2 = A()
obj1.ref = obj2
obj2.ref = obj1  # 形成循環(huán)引用

del obj1, obj2  # 引用計(jì)數(shù)沒(méi)有歸零,Python 需要 GC 來(lái)清理

gc.collect()  # 手動(dòng)觸發(fā)垃圾回收

2. Python 內(nèi)存優(yōu)化技巧

2.1 使用 __slots__限制對(duì)象屬性

默認(rèn)情況下,Python 的對(duì)象使用 動(dòng)態(tài)字典(__dict__) 存儲(chǔ)屬性,占用大量?jī)?nèi)存。如果你的類屬性是固定的,可以用 __slots__ 優(yōu)化,之前花姐在其它文章中提到過(guò)。

class NormalClass:
    pass

class SlotClass:
    __slots__ = ['name', 'age']  # 僅允許 name 和 age 兩個(gè)屬性

obj1 = NormalClass()
obj1.name = "花姐"
obj1.age = 18
obj1.gender = "女"  # 允許動(dòng)態(tài)添加新屬性

obj2 = SlotClass()
obj2.name = "花姐"
obj2.age = 18
# obj2.gender = "女"  # ? AttributeError: 'SlotClass' object has no attribute 'gender'

__slots__ 會(huì)讓 Python 不再為對(duì)象創(chuàng)建 __dict__,從而減少內(nèi)存占用。

2.2 避免不必要的臨時(shí)變量

Python 解釋器會(huì)緩存一些常見(jiàn)的對(duì)象,例如 小整數(shù)-5256 在 Python 3.9 及以前的版本),以及部分 短字符串。

但在 Python 3.10+ 之后,整數(shù)的緩存范圍 可能更大,具體行為依賴于 Python 實(shí)現(xiàn)。

# 可能被緩存(具體范圍取決于 Python 版本)
a = 256
b = 256
print(a is b)  # True

# 可能不被緩存
a = 257
b = 257
print(a is b)  # 3.9 以前通常 False,3.10+ 可能 True

結(jié)論:Python 會(huì)緩存小整數(shù),但具體范圍視 Python 版本而定,不建議過(guò)分依賴此特性!

2.3 使用生成器代替列表

如果你只需要 逐個(gè)獲取數(shù)據(jù),而不是一次性加載所有數(shù)據(jù),請(qǐng)用 生成器 代替列表。

# 占用大量?jī)?nèi)存的方式
nums = [i for i in range(10**6)]

# 更優(yōu)的方式(惰性加載)
def num_generator():
    for i in range(10**6):
        yield i

gen = num_generator()

為什么? 生成器不會(huì)一次性把所有數(shù)據(jù)存入內(nèi)存,而是每次 yield 一個(gè)值,這樣可以大幅降低內(nèi)存占用!

2.4 使用 array 代替列表存儲(chǔ)大量數(shù)值

如果你需要存儲(chǔ)大量的數(shù)值,使用 array 模塊比 list 更節(jié)省內(nèi)存。

import array

# 創(chuàng)建一個(gè)存儲(chǔ) int 類型的數(shù)組,比列表更節(jié)省內(nèi)存
arr = array.array('i', range(10**6))

2.5 使用 deque 代替列表進(jìn)行隊(duì)列操作

collections.deque 具有更高效的 頭部插入和刪除 操作,比 listpop(0)insert(0, x) 更優(yōu)。

from collections import deque

dq = deque(range(10**6))
dq.appendleft(-1)  # O(1) 復(fù)雜度

# 而 list.insert(0, -1) 是 O(n),在大規(guī)模數(shù)據(jù)下性能差距明顯

3. 釋放不用的內(nèi)存

手動(dòng)釋放變量

Python 采用 自動(dòng)垃圾回收,但如果你想主動(dòng)釋放大對(duì)象,建議使用 del 并 調(diào)用 gc.collect()。

import gc

data = [i for i in range(10**6)]
del data  # 刪除變量
gc.collect()  # 強(qiáng)制觸發(fā)垃圾回收

在大數(shù)據(jù)處理中,這個(gè)方法可以 顯著減少內(nèi)存占用!

總結(jié)

Python 采用 引用計(jì)數(shù) + 垃圾回收 來(lái)管理內(nèi)存。

使用 __slots__ 可以節(jié)省對(duì)象的 屬性存儲(chǔ)空間。

避免不必要的臨時(shí)變量,Python 會(huì)緩存小整數(shù),但范圍 依賴 Python 版本。

用生成器替代列表,節(jié)省內(nèi)存!

用 array 代替 list 存儲(chǔ)大量數(shù)值,提高內(nèi)存效率。

用 deque 代替 list 進(jìn)行隊(duì)列操作,提高性能。

手動(dòng)釋放大對(duì)象,使用 del + gc.collect() 及時(shí)清理。

到此這篇關(guān)于Python中內(nèi)存管理機(jī)制與優(yōu)化技巧分享的文章就介紹到這了,更多相關(guān)Python內(nèi)存管理與優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python基礎(chǔ)入門(mén)學(xué)習(xí)筆記(Python環(huán)境搭建)

    python基礎(chǔ)入門(mén)學(xué)習(xí)筆記(Python環(huán)境搭建)

    這篇文章主要介紹了python基礎(chǔ)入門(mén)學(xué)習(xí)筆記,這是開(kāi)啟學(xué)習(xí)python基礎(chǔ)知識(shí)的第一篇,夯實(shí)Python基礎(chǔ),才能走的更遠(yuǎn),感興趣的小伙伴們可以參考一下
    2016-01-01
  • Python符號(hào)計(jì)算之實(shí)現(xiàn)函數(shù)極限的方法

    Python符號(hào)計(jì)算之實(shí)現(xiàn)函數(shù)極限的方法

    這篇文章主要介紹了Python符號(hào)計(jì)算之實(shí)現(xiàn)函數(shù)極限的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 使用Python實(shí)現(xiàn)將HTML內(nèi)容格式插入Word文檔

    使用Python實(shí)現(xiàn)將HTML內(nèi)容格式插入Word文檔

    在日常開(kāi)發(fā)和業(yè)務(wù)流程中,我們經(jīng)常需要生成包含復(fù)雜格式和動(dòng)態(tài)內(nèi)容的Word文檔,本文將介紹如何使用Python實(shí)現(xiàn)將HTML內(nèi)容格式插入Word文檔,感興趣的小伙伴可以了解下
    2026-01-01
  • Python默認(rèn)參數(shù)的定義與注意事項(xiàng)詳解

    Python默認(rèn)參數(shù)的定義與注意事項(xiàng)詳解

    本章深入探討默認(rèn)參數(shù)的定義與注意事項(xiàng),解析其重要性并應(yīng)用場(chǎng)景,通過(guò)示例與最佳實(shí)踐提升編程效率和代碼質(zhì)量,同時(shí)介紹常見(jiàn)問(wèn)題與解決方案,助你順利掌握Python核心技能,需要的朋友可以參考下
    2026-05-05
  • .img/.hdr格式轉(zhuǎn).nii格式的操作

    .img/.hdr格式轉(zhuǎn).nii格式的操作

    這篇文章主要介紹了.img/.hdr格式轉(zhuǎn).nii格式的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • python利用pandas和csv包向一個(gè)csv文件寫(xiě)入或追加數(shù)據(jù)

    python利用pandas和csv包向一個(gè)csv文件寫(xiě)入或追加數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于python利用pandas和csv包向一個(gè)csv文件寫(xiě)入或追加數(shù)據(jù)的相關(guān)資料,我們?cè)絹?lái)越多的使用pandas進(jìn)行數(shù)據(jù)處理,有時(shí)需要向一個(gè)已經(jīng)存在的csv文件寫(xiě)入數(shù)據(jù),需要的朋友可以參考下
    2023-07-07
  • Python3如何使用tabulate打印數(shù)據(jù)

    Python3如何使用tabulate打印數(shù)據(jù)

    這篇文章主要介紹了Python3如何使用tabulate打印數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • python三種數(shù)據(jù)結(jié)構(gòu)及13種創(chuàng)建方法總結(jié)

    python三種數(shù)據(jù)結(jié)構(gòu)及13種創(chuàng)建方法總結(jié)

    拿Python來(lái)說(shuō),數(shù)據(jù)結(jié)構(gòu)的概念也是超級(jí)重要,不同的數(shù)據(jù)結(jié)構(gòu),有著不同的函數(shù),供我們調(diào)用,接下來(lái),我們分別來(lái)介紹字符串、列表、字典的創(chuàng)建方法
    2021-09-09
  • 一行代碼解決動(dòng)態(tài)執(zhí)行Python函數(shù)方法實(shí)例

    一行代碼解決動(dòng)態(tài)執(zhí)行Python函數(shù)方法實(shí)例

    這篇文章主要為大家介紹了如何用一行代碼解決動(dòng)態(tài)執(zhí)行Python函數(shù)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 使用Python進(jìn)行同期群分析(Cohort?Analysis)

    使用Python進(jìn)行同期群分析(Cohort?Analysis)

    同期群(Cohort)的字面意思(有共同特點(diǎn)或舉止類同的)一群人,比如不同性別,不同年齡。這篇文章主要介紹了用Python語(yǔ)言來(lái)進(jìn)行同期群分析,感興趣的同學(xué)可以閱讀參考一下本文
    2023-03-03

最新評(píng)論

阿拉善右旗| 六枝特区| 达孜县| 铅山县| 廊坊市| 井冈山市| 鄢陵县| 萨嘎县| 云浮市| 乐昌市| 垫江县| 沅江市| 德保县| 河池市| 临颍县| 辰溪县| 丰宁| 璧山县| 惠来县| 上杭县| 周口市| 辽阳市| 西乡县| 阳新县| 利辛县| 林西县| 夏河县| 五莲县| 宁晋县| 东城区| 宁陵县| 庄浪县| 汨罗市| 崇左市| 曲周县| 罗田县| 房山区| 汨罗市| 财经| 静海县| 太和县|