
大模型RAG技術:從入門到實踐
Python的垃圾回收機制類似于其他高級語言,如Java和C++。但與這些語言不同,Python不需要提前聲明變量類型,而是在運行時動態分配內存。這種動態分配是Python被稱為動態類型語言的原因之一。垃圾回收會自動清理不再使用的內存區域,確保程序的運行效率。
Python采用引用計數來管理內存。每個對象都有一個計數器,記錄指向該對象的引用數。如下圖所示,一個對象在被創建時,其引用計數為1。當另一個變量指向同一對象時,引用計數增加。例如:
x = 3.14
y = x
print(id(x) == id(y)) # 輸出:True
在上述代碼中,x
和 y
指向同一對象3.14,其引用計數增加到2。
Python使用內存池機制來優化小對象的內存管理。當請求的內存在1到256字節之間時,Python會使用自己的內存管理系統,而不直接調用操作系統的內存分配函數。這種機制減少了內存碎片,并提高了內存分配效率。
對于在內存池中登記的內存,Python并不會調用C語言的free
來釋放,而是將其回收到內存池中以便下次使用。這種方式優化了小對象的內存管理,但也可能導致內存無法及時釋放。
為了手動釋放內存,Python提供了gc
模塊,可以手動觸發垃圾回收。例如:
import gc
del a, b, c # 刪除變量
gc.collect() # 手動垃圾回收
通過調用gc.collect()
,可以立即釋放不再使用的內存。
在某些情況下,可能需要清空所有全局變量??梢酝ㄟ^自定義函數實現:
def clear_globals():
for key in list(globals().keys()):
if not key.startswith('__'):
del globals()[key]
clear_globals()
這段代碼會刪除所有非內置的全局變量。
在Python中,變量更像是附在對象上的標簽。當對象被多個變量引用時,修改其中一個變量會影響其他變量。這種現象稱為淺拷貝。
list1 = [1, 2, 3]
list2 = list1
list2.append(4)
print(list1) # 輸出:[1, 2, 3, 4]
對于需要獨立副本的情況,可以使用深拷貝。深拷貝會為所有嵌套對象創建獨立的副本:
import copy
list1 = [1, 2, [3, 4]]
list2 = copy.deepcopy(list1)
list2[2].append(5)
print(list1) # 輸出:[1, 2, [3, 4]]
Python的分代回收機制基于這樣的假設:存活時間越長的對象,越可能繼續存活。通過將對象分為三代(0代、1代、2代),Python減少了對長壽命對象的掃描頻率,提升了垃圾回收的效率。
可以使用gc
模塊調整不同代的垃圾回收頻率:
import gc
gc.set_threshold(700, 10, 5) # 設置垃圾回收閾值
問:Python中如何手動釋放內存?
gc.collect()
手動觸發垃圾回收,釋放不再使用的內存。問:什么是Python的引用計數?
問:Python的淺拷貝和深拷貝有什么區別?
問:如何避免Python中的內存泄漏?
問:Python為什么需要分代回收機制?