python如何为创建大量实例节省内存


Posted in Python onMarch 20, 2018

python如何为创建大量实例节省内存,具体内容如下

案例:

某网络游戏中,定义了玩家类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 相关文章推荐
Python中的列表知识点汇总
Apr 14 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
Python ldap实现登录实例代码
Sep 30 Python
Python操作Excel之xlsx文件
Mar 24 Python
Python生成随机密码的方法
Jun 16 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
matplotlib给子图添加图例的方法
Aug 03 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
Python基础之Socket通信原理
Apr 22 Python
python 中的jieba分词库
Nov 23 Python
python如何对实例属性进行类型检查
Mar 20 #Python
python如何在循环引用中管理内存
Mar 20 #Python
Windows 7下Python Web环境搭建图文教程
Mar 20 #Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 #Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 #Python
Django开发中复选框用法示例
Mar 20 #Python
python如何通过twisted实现数据库异步插入
Mar 20 #Python
You might like
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
Python实现的批量下载RFC文档
2015/03/10 Python
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
Python pickle模块实现对象序列化
2019/11/22 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
股东授权委托书
2014/10/15 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
2014年文秘工作总结
2014/11/25 职场文书
2015年采购部工作总结
2015/04/23 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
保险公司增员口号
2015/12/25 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS
使用springMVC所需要的pom配置
2021/09/15 Java/Android
Vue的过滤器你真了解吗
2022/02/24 Vue.js