python面向对象--使用__slots__节省内存空间

假如你的python程序需要创建大量对象,这个数量级达到了百万,那么你可以通过使用__slots__来节省内存

先来看一个普通类

import os
import psutil

class Stu:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

lst = []
for i in range(1000000):
    lst.append(Stu('小明', 18, 600))

process = psutil.Process(os.getpid())
print('Used Memory:',process.memory_info().rss / 1024 / 1024,'MB')

对于普通定义的类,每个实例都会创建一个字典来保存实例属性,也就是__dict__。熟悉数据结构的朋友肯定知道,为了实现O(1)的查找效率,字典的实现额外的使用一些内存空间,即便是一个空字典也要占用200多字节的空间

print(sys.getsizeof({}))

如果你创建几百万个Stu实例,内存的消耗就是你不得不考虑的事情,上面的代码执行会占用176M的内存空间。

使用了__slots__后,就不再为每个实例创建用于保存属性的字典,由于属性已经固定,不允许增加,因此python在内部采取一种更加紧凑的内部表示,这和列表和元组有些相似。

import os
import psutil

class Stu:
    __slots__ = ['name', 'age', 'score']
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

lst = []
for i in range(1000000):
    lst.append(Stu('小明', 18, 600))

process = psutil.Process(os.getpid())
print('Used Memory:',process.memory_info().rss / 1024 / 1024,'MB')

使用内存为76M

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案