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之不要红头文件(2)
Sep 28 Python
简单的Python抓taobao图片爬虫
Oct 26 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
Python自动发邮件脚本
Mar 31 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
Python requests上传文件实现步骤
Sep 15 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 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的Yii框架中日志的相关配置及使用
2015/12/08 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
javascript中if和switch,==和===详解
2015/07/30 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
Python如何调用JS文件中的函数
2019/08/16 Python
python 发送json数据操作实例分析
2019/10/15 Python
详解Django admin高级用法
2019/11/06 Python
python 实现绘制整齐的表格
2019/11/18 Python
python3实现弹弹球小游戏
2019/11/25 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
Linux的主要特性
2014/10/06 面试题
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang