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类方法__init__和__del__构造、析构过程分析
Mar 06 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
python通过zabbix api获取主机
Sep 17 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
python协程之动态添加任务的方法
Feb 19 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
基于python调用psutil模块过程解析
Dec 20 Python
python各层级目录下import方法代码实例
Jan 20 Python
jenkins+python自动化测试持续集成教程
May 12 Python
python爬取youtube视频的示例代码
Mar 03 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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 中文和编码判断代码
2010/05/16 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
javascript 冒号 使用说明
2009/06/06 Javascript
JSQL  一个 web DB 的封装
2010/05/05 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
javascript整除实现代码
2010/11/23 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
2016/05/20 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
js实现下一页页码效果
2017/03/07 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
python os模块在系统管理中的应用
2020/06/22 Python
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
网络信息安全承诺书
2014/03/26 职场文书
学习之星事迹材料
2014/05/17 职场文书
助理政工师申报材料
2014/06/03 职场文书
学校教师读书活动总结
2014/07/08 职场文书
计算机专业自荐信
2015/03/05 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python