案例:

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

  需求:

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

如何做?

首先要明白,python中的类可以动态的添加属性,实则在内存中有个__dict__方法维护了这种动态添加属性,它占有内存,把它关掉,不就达到省内存要求了?

#!/usr/bin/python3

import time
import sys

class Player(object):
    def __init__(self, id, name, status):
        self.id = id
        self.name = name
        self.status = status

if __name__ == '__main__':
    player_1 = Player(1, 'bei_bei', '上线')
    print(player_1.__dict__)

    print('_' * 100)
    # 动态装配属性
    player_1.money = 10000
    player_1.__dict__['time'] = time.time()
    print(player_1.__dict__)
    print(player_1.money, player_1.time)

    print('_' * 100)
    # 打印__dict__占用的内存空间
    print('dict方法占用内存:', sys.getsizeof(player_1.__dict__))

    print('_'*100)
    # 动态删除属性
    print(player_1.__dict__)
    del player_1.__dict__['time']

    del player_1.money
    print(player_1.__dict__)

通过__slots__属性,声明实例属性名字的列表

#!/usr/bin/python3

class Player(object):
    # 通过slots方法指定类的定长属性
    __slots__ = ['id', 'name', 'status']

    def __init__(self, id, name, status):
        self.id = id
        self.name = name
        self.status = status

if __name__ == '__main__':
    player_1 = Player(1, 'bei_bei', '上线')
    print(player_1.id, player_1.name, player_1.status)

    # 尝试输出__dict__属性,发现没有,就无法动态的装配类属性,达到省内存的目的
    try:
        print(player_1.__dict__)
    except Exception as e:
        print(e)

  

  

python_如何为创建大量实例节省内存?的更多相关文章

  1. python类与对象-如何为创建大量实例节省内存

    如何为创建大量实例节省内存 问题举例 在网络游戏中,定义玩家类Player(id, name, level...), 每个玩家在线将创建一个Player实例,当在线人数很多时,将产生大量实例, 如何降 ...

  2. python 百万级别类实例实现节省内存

    # 案例: ''' 某网络游戏中,定义了玩家类Player(id,name,status) 每当有一个玩家,就会在服务器创建一个Player实例 当在线人数过多时,将产生大量实例(百万级别),消耗内存 ...

  3. 一起talk C栗子吧(第一百三十三回:C语言实例--创建进程时的内存细节)

    各位看官们.大家好,上一回中咱们说的是从内存角度看进程和线程的样例.这一回咱们说的样例是:创建进程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们都知道使用fork函数能 ...

  4. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  5. ESS控制台发布新功能:创建多实例规格的伸缩配置

    背景 原弹性伸缩ESS服务限定,生效的伸缩配置中只能对应一种实例规格,这样就会存在如果生效的配置中的实例规格的库存不足(高配实例规格通常更容易出现库存不足的情况)时, 用户配置好的伸缩规则以及伸缩组对 ...

  6. java内存缓存,节省内存

    缓存的对象 这个问题就是我们上面提到的极端情况,在Java中,会对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回 ...

  7. Oracle基础(二) 创建数据库实例

    Oracle中数据库也称为数据库实例,在Oracle在安装过程中可以选择创建数据库,也可以再安装之后再进行创建. 一般创建数据库可以使用图形界面方式和SQL指令的方式,由于SQL指令方式较为复杂,这里 ...

  8. JS高级---构造函数通过原型添加方法,原型的作用: 共享数据, 节省内存空间

    JS高级---构造函数,通过原型添加方法,原型的作用: 共享数据, 节省内存空间 构造函数 //构造函数 function Person(sex, age) { this.sex = sex; thi ...

  9. OpenStack创建Win10实例

    直接用Windows的iso文件创建实例是创建不出来的,需要先在kvm下创建qcow2格式的虚拟机,然后用已经创建好的虚拟机文件当做OpenStack的镜像来创建实例就好了. 首先第一点是需要有一台L ...

随机推荐

  1. javascript 之this指针-11

    前言 在<javascript 之执行环境-08>文中说到,当JavaScript代码执行一段可执行代码时,会创建对应的执行上下文(execution context).对于每个执行上下文 ...

  2. python3之日期和时间

    1.python3日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时 ...

  3. (4程序框架)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  4. YDKJS:作用域与闭包

    作用域与闭包 什么是作用域 编译器 理解作用域 嵌套的作用域 词法作用域 词法分析时 欺骗词法作用域 函数与块作用域 函数中的作用域 隐藏标识符于普通作用域 函数作为作用域 块作为作用域 提升 先有鸡 ...

  5. 代理内网上网-iptables

    代理内网上网-iptables 1.1 环境说明 主机A:(能上网) ip:内172.16.1.7/24 外10.0.0.7/24 系统CentOS 6.9 主机B:(不能上网) ip:内172.16 ...

  6. equals和hashcode重写的问题

    public static void main(String[] args) { Set<Test> set = new HashSet<>(); Test t1 = new ...

  7. V4l2的结构体 --- ioctl【转】

      在应用程序获取视频数据的流程中,都是通过 ioctl 命令与驱动程序进行交互,常见的 ioctl 命令有: VIDIOC_QUERYCAP /* 获取设备支持的操作 */ VIDIOC_G_FMT ...

  8. SSH Secure Shell Client最新版,解决Win10不兼容问题

    SSH的工具很多,像XShell,SecureCRT等等. 不过我一直用的是:SSH Secure Shell Client 主要的原因就是: 软件本身带文件浏览的功能,可以通过拖拽去实现文件上传和下 ...

  9. 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  10. 树状数组-HDU1541-Stars一维树状数组 POJ1195-Mobile phones-二维树状数组

    树状数组,学长很早之前讲过,最近才重视起来,enmmmm... 树状数组(Binary Indexed Tree(B.I.T), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据 ...