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模块顶层运行的代码引起的一个Bug
Jul 04 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 Python
OpenCV+Python--RGB转HSI的实现
Nov 27 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
Django Path转换器自定义及正则代码实例
May 29 Python
代码复现python目标检测yolo3详解预测
May 06 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
几种显示数据的方法的比较
2006/10/09 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
php生成curl命令行的方法
2015/12/14 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
微信小程序的引导页实现代码
2020/06/24 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
详解python中的文件与目录操作
2017/07/11 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
基于python实现KNN分类算法
2020/04/23 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
接待员岗位责任制
2014/02/10 职场文书
个人借款担保书
2014/04/02 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
财政局长个人总结
2015/03/04 职场文书
警示教育观后感
2015/06/17 职场文书