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中循环语句while用法实例
May 16 Python
python定时器(Timer)用法简单实例
Jun 04 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
利用Python如何实现一个小说网站雏形
Nov 23 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
python爬取音频下载的示例代码
Oct 19 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
Python析构函数__del__定义原理解析
Nov 20 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 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 变量定义方法
2009/06/14 PHP
需要发散思维学习PHP
2009/06/29 PHP
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
php 魔术方法详解
2014/11/11 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
python中global用法实例分析
2015/04/30 Python
在Django中创建第一个静态视图
2015/07/15 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
python简单操作excle的方法
2018/09/12 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
python实现斗地主分牌洗牌
2020/06/22 Python
python tkinter实现连连看游戏
2020/11/16 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
EJB与JAVA BEAN的区别
2016/08/29 面试题
宿舍违规检讨书
2014/01/12 职场文书
国际经济贸易专业自荐信
2014/06/13 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS