前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >__slots__ 为创建很多实例节省内存

__slots__ 为创建很多实例节省内存

作者头像
生信编程日常
发布2020-04-16 17:38:25
4220
发布2020-04-16 17:38:25
举报

当我们在需要创建很多实例的情况下,怎么更好的节省内存是个问题。比如一个系统,有许多用户的信息,同时访问的话会创建很多实例。

引入__slots__属性,是个很好的解决方法。如下例所示:

代码语言:javascript
复制
class First():
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        
class Second():
    __slots__ = ['name', 'age', 'gender']
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

将其实例化并看两者的属性差异:

代码语言:javascript
复制
first = First('Rose', 32, 'female')
second = Second('Jack', 30, 'male')

set(dir(first)) - set(dir(second))

输出:{'__dict__', '__weakref__'}

可以看到first比second多了这两个属性。其中'__weakref__'一般占用很少。主要说说__dict__。其中__dict__是可以动态绑定属性的:

代码语言:javascript
复制
print(first.__dict__)

输出:{'name': 'Rose', 'age': 32, 'gender': 'female'}

也就是class中定义的属性,我们在定义之后仍然可以绑定属性:

代码语言:javascript
复制
first.x = "something" 
# 或者
# first.__dict__["x"] = "something"
first.__dict__

输出:{'name': 'Rose', 'age': 32, 'gender': 'female', 'x': 'something'}

删除这个属性:

代码语言:javascript
复制
del first.__dict__['x']

这样的动态绑定会占用内存,用sys模块看一下:

代码语言:javascript
复制
import sys
print(sys.getsizeof(first.__dict__))
print(sys.getsizeof(first.name))

输出:112, 53

这个字典仍然占用112个字节。在实例多的话仍然是个不小的负担。用__slots__ 限制绑定是个有效的方法。

需要注意的是,这样继承的子类仍然没有限制绑定:

代码语言:javascript
复制
class ChildSecond(Second):
    pass

child = ChildSecond('Jack', 30, 'male')
child.y = 'any'

这样仍然可以绑定新的属性,除非在子类中也定义__slots__。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档