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简单生成8位随机密码的方法
May 24 Python
python用户管理系统的实例讲解
Dec 23 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
Python将图片转换为字符画的方法
Jun 16 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
python输出pdf文档的实例
Feb 13 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
python 数据类型强制转换的总结
Jan 25 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 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
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
php实现的递归提成方案实例
2015/11/14 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
Python中处理时间的几种方法小结
2015/04/09 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
公司JAVA开发面试题
2015/04/02 面试题
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
委托书范本
2014/04/02 职场文书
医学生求职自荐书
2014/06/12 职场文书
农业生产宣传标语
2014/10/08 职场文书
避暑山庄导游词
2015/02/04 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
Python字典的基础操作
2021/11/01 Python
Django基础CBV装饰器和中间件
2022/03/22 Python