Python内存优化:__slots__与生成器的妙用
大家好,今天我们来聊聊Python内存优化的一些实用技巧。Python以其易用性和丰富的库而闻名,但有时在处理大型数据集或创建大量对象时,内存占用可能会成为瓶颈。我们将深入探讨两个关键技术:__slots__和生成器,它们可以显著减少Python程序的内存占用。
__slots__:节省对象内存的利器
在Python中,当我们创建一个类的实例时,Python会自动创建一个字典__dict__来存储该实例的所有属性。这个__dict__是一个非常灵活的结构,允许我们在运行时动态地添加、删除属性。然而,这种灵活性也带来了额外的内存开销。对于创建大量实例的类,这些__dict__字典可能会占用大量的内存。
__slots__正是为了解决这个问题而生的。通过在类定义中声明__slots__,我们可以告诉Python解释器:这个类的实例只会有这些属性,不需要创建__dict__。相反,Python会为每个__slots__中声明的属性分配固定的空间,从而大大减少内存占用。
__slots__的工作原理
当我们定义一个类时,Python通常会为每个实例创建一个__dict__字典,用于存储实例的属性和值。__slots__通过以下方式改变了这个行为:
- 阻止创建
__dict__: 如果一个类定义了__slots__,那么Python不会为该类的实例创建__dict__。 - 创建描述符: Python会为
__slots__中定义的每个属性创建一个描述符(descriptor)。描述符是一种特殊的对象,它定义了如何访问、设置和删除一个属性。 - 固定大小的内存空间: 每个
__slots__属性都有预先分配的内存空间,用于存储该属性的值。
使用__slots__的语法
__slots__是一个类变量,它是一个字符串序列(列表、元组或集合),用于指定实例可以拥有的属性名称。
class Point:
__slots__ = ['x', 'y']
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(10, 20)
print(p.x, p.y) # 输出:10 20
# 尝试添加未声明的属性会导致AttributeError
try:
p.z = 30
except AttributeError as e:
print(e) # 输出:'Point' object has no attribute 'z'
__slots__的优势
- 减少内存占用: 这是
__slots__最主要的优势。通过避免创建__dict__,可以显著减少对象的内存占用,尤其是在创建大量对象时。 - 提高属性访问速度: 访问
__slots__中定义的属性通常比访问__dict__中的属性更快,因为Python可以直接通过描述符访问属性,而不需要查找字典。
__slots__的局限性
- 不能动态添加属性: 一旦定义了
__slots__,就不能再动态地向实例添加新的属性。这是因为没有__d

最低0.47元/天 解锁文章
1127

被折叠的 条评论
为什么被折叠?



