加菲猫欢乐跑
65.99M · 2026-03-26
本篇带你一次吃透:
简单一句话:
Python 使用引用计数(Reference Counting)为主,垃圾回收(Garbage Collection)为辅,同时内置私有内存池以提升性能。
也就是说:
这套机制让 Python 运行时保持高效而稳定。
每个对象都有一个引用计数(refcount):
例如:
import sys
a = [1, 2, 3]
print(sys.getrefcount(a)) # 2 (一个是a,一个是参数传递)
b = a
print(sys.getrefcount(a)) # 3
del b
print(sys.getrefcount(a)) # 2
引用计数机制简单直接,“计数为 0 就释放”,所以 Python 中大多数对象释放是 即时 的。
问题来了:如果两个对象互相引用,会怎样?
class Node:
def __init__(self):
self.next = None
a = Node()
b = Node()
a.next = b
b.next = a
即便你执行:
del a
del b
对象的引用计数依然不为 0,因为它们互相指着自己。 这种情况就需要 Python 的 GC(垃圾回收器) 出手了。
Python 内存回收使用 分代垃圾回收(Generational GC)。
它将对象分成三代:
为什么要这样?
因为经验告诉我们:
GC 工作流程:
Python 提供了一个模块 gc 可以让你:
import gc
print(gc.isenabled())
gc.collect()
gc.set_debug(gc.DEBUG_LEAK)
def gen():
for i in range(10_000_000):
yield i
生成器一次只产生一个元素,比列表省太多内存。
del 显式删除大型对象适合大规模数据处理:
del big_list
gc.collect()
例如数据处理中:
df2 = df1 # 共享内存!不会复制
如需复制,务必用:
df2 = df1.copy()
slots 优化内存class Person:
__slots__ = ("name", "age")
对象不再使用 __dict__ 存储属性,节省 30%-50% 内存。
比如:
list append 比自己实现的链表快得多Python 的内存管理并不复杂,本质上就是:
理解这些机制,你就能: