栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python创建大量实例时如何节省内存

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python创建大量实例时如何节省内存

1、如何为创建大量实例节省内存?

        实际案例:

               某网络游戏中,定义了玩家类Player(id, name, status, ...),每有一个在线玩家,在服务器程序内侧有一个Player的实例,当在线人数很多时,将产生大量实例。(如百万级)

                如何降低这些大量实例的内存开销?

        解决方案:

                定义类的__slots__属性,它是用来声明实例属性名字的列表,减少实例的__dict__字典从而达到节省内存开销的目的。

2、代码演示
class Player(object):
    def __init__(self, uid, name, status=0, level=1):
        self.uid = uid
        self.name = name
        self.status = status
        self.level = level


class Player2(object):
    # 定义__slots__变量,它用来声明实例有哪些属性
    # 作用是阻止在实例化类时为实例分配dict
    __slots__ = ['uid', 'name', 'status', 'level']

    def __init__(self, uid, name, status=0, level=1):
        self.uid = uid
        self.name = name
        self.status = status
        self.level = level


'''
__slots__内置方法介绍:
    (1)__slots__允许声明并限定类成员,并拒绝创建__dict__ 
    和__weakref__属性以节约内存空间。
    (2)在定义了__slots__变量后,类实例已经不能随意创建不在_
    _slots__定义的属性,同时实例中也不再有__dict__结构。
    (3)继承树:
        子类未声明__slots__时,不继承父类的__slots__,
        即此时子类可以随意赋值属性。
        子类声明了__slots__时,继承父类的__slots__,即此时子类的
        __slots__为其自身+父类的__slots__。
'''

# 创建Player和Player2的实例
p1 = Player('0001', 'Bob')
p2 = Player2('0001', 'Bob')

# p1比p2使用的内存要多,通过集合的差集查看
print(set(dir(p1)) - set(dir(p2)))
# 输出结果为:{'__dict__', '__weakref__'}
'''
可以看出p1比p2多了__dict__和__weakref__属性,在不使用弱引用的情况下
__weakref__并不会占用多少内存,最终占用都会落到__dict__上。
'''
# __dict__是为了实例动态绑定属性的一个字典
print(p1.__dict__)
# 如p1没有x属性,为p1动态绑定一个x属性
p1.x = 123
p1.__dict__['y'] = 99
# 可以发现x和y进入到字典当中去了
print(p1.__dict__)
# 也可以动态删除(解除)
del p1.__dict__['y']
print(p1.__dict__)
'''
这样一个动态绑定属性的特性它是以牺牲内存为代价的,
为了节省内存关闭掉动态绑定属性的特性就使用__slots__。
'''
import sys

# 得到一个对象使用的内存
print(sys.getsizeof(p1.__dict__))

'''
提前声明好的在定义额外的属性是不允许的。如:为p2绑定新的属性,
会报错 AttributeError: 'Player2' object has no attribute 'x'
这就类似于C语言的结构体,提前分配好了这些空间,这样就达到了节省内存目的。
也就少了一个__dict__字典,__slots__副作用就是阻止动态属性绑定。
'''
# p2.x = 123

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号