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常见文件操作的函数示例代码
Nov 15 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
名片管理系统python版
Jan 11 Python
对python中的pop函数和append函数详解
May 04 Python
numpy中矩阵合并的实例
Jun 15 Python
替换python字典中的key值方法
Jul 06 Python
Django之模型层多表操作的实现
Jan 08 Python
Python递归及尾递归优化操作实例分析
Feb 01 Python
python随机模块random使用方法详解
Feb 14 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
PyQt使用QPropertyAnimation开发简单动画
Apr 02 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 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将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
浅谈Vue.js
2017/03/02 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
Python中动态创建类实例的方法
2017/03/24 Python
Python模块的加载讲解
2019/01/15 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
Python使用进程Process模块管理资源
2020/03/05 Python
区优秀教师事迹材料
2014/02/10 职场文书
婚礼主持结束词
2014/03/13 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
大学生入党群众意见书
2015/06/02 职场文书
2015年暑假工作总结
2015/07/13 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS