遇到问题:

游戏服务器的怪物数据monsterdata.py 用字典表示,怪物字典数据基本做取值和修改处理,不额外增加字段,py文件大小100m,想办法节省内存,根据特点,不使用原生的dict数据结构,用ConstDict是去代替,内存节省到50m左右。

ConstDict

python代替的dict数据结构

若字典不会增加字段,只读/原字段修改
使用ConstDict可节省内存

dict()内存主要消耗的地方:

1、dict扩容机制,预留内存空间
2、dict也是一个对象,内部会动态维护__dict__,增加slot类属性可以节省内容

节省内存大小:一半左右,字段越大节省越多

适用场景:需要生成大量的静态字典场景

缺点:根据字典的属性,需要先生成类,再生成对象

python版本:python2.7

例子代码:

>>> test_dic = {
...     "m_HP": 1,
...     "m_MP": 2,
...     "m_Attack": 3,
...     "m_Defense": 4,
...     "m_Speed": 5,
...     "m_Dodge": 6,
...     "m_Hit": 7,
...     "m_Double": 8,
... }
>>>
>>> class MonsterDict(constdict.ConstDict):
...     __slots__ = test_dic.keys()>>> const_dic = MonsterDict(test_dic)
>>> print(asizesof(test_dic))
(1192,)
>>> print(asizesof(const_dic))
(584,)>>> print(const_dic)
{'m_Defense': 4, 'm_Speed': 5, 'm_Hit': 7, 'm_Double': 8, 'm_Attack': 3, 'm_HP': 1, 'm_Dodge': 6, 'm_MP': 2}>>> print(const_dic.keys())
['m_HP', 'm_Defense', 'm_Speed', 'm_Attack', 'm_Dodge', 'm_MP', 'm_Hit', 'm_Double']>>> print(const_dic.values())
[1, 4, 5, 3, 6, 2, 7, 8]>>> const_dic["m_Dodge"] = 12456
>>> print(const_dic["m_Dodge"])
12456>>> print(const_dic.iteritems())
<generator object <genexpr> at 0x00000000094FA2C8>

ConstDict.py 代码:

# -*- coding: utf-8 -*-class ConstDict(object):def __init__(self, dic):for key, val in dic.iteritems():setattr(self, key, val)def __iter__(self):return iter(self.__slots__)def __getitem__(self, item):return getattr(self, item, None)def __setitem__(self, key, value):return setattr(self, key, value)def __contains__(self, item):try:return getattr(self, item, False)except:return Falsedef get(self, key, default):return getattr(self, key, default)def iteritems(self):return ((key, getattr(self, key, None)) for key in self.__slots__)def items(self):return [(key, getattr(self, key, None)) for key in self.__slots__]def iterkeys(self):return iter(self.__slots__)def itervalues(self):return (getattr(self, key, None) for key in self.__slots__)def keys(self):return self.__slots__def values(self):return [getattr(self, key, None) for key in self.__slots__]def update(self, dic):"""const dict noly support exist keys update"""for key, val in dic.iteritems():if getattr(self, key, False):setattr(self, key, val)raise NotImplementedError("ConstDictBase not support update")def __str__(self):return str(dict(self.items()))

代码优化维护会在gitbub更新

github:GitHub - Grente/ConstDict: python节省内存的字典数据结构

Python内存优化,节省内存字典ConstDict相关推荐

  1. Android:最全面详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

    前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情.真正的大师永远怀有一颗学徒的心. 一.概述 在Android中,性能优化是细分领域中最难且也是知识面涉及最深和最广的方向之一. 更快 ...

  2. 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )

    文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...

  3. java 内存_java节省内存的几条建议

    java节省内存的几条建议 引导语:Java的主要工作是通过编程语言来制作互联网页面.制作动态效果以及网站等技术,以下是小编整理的java节省内存的几条建议,欢迎参考阅读! 1. 尽量在合适的场合使用 ...

  4. MySQL高级 - 内存优化 - InnoDB内存优化

    InnoDB 内存优化 innodb用一块内存区做IO缓存池,该缓存池不仅用来缓存innodb的索引块,而且也用来缓存innodb的数据块. innodb_buffer_pool_size 该变量决定 ...

  5. MySQL高级 - 内存优化 - MyISAM内存优化

    MyISAM 内存优化 myisam存储引擎使用 key_buffer 缓存索引块,加速myisam索引的读写速度.对于myisam表的数据块,mysql没有特别的缓存机制,完全依赖于操作系统的IO缓 ...

  6. Android 内存优化——常见内存泄露及优化方案

    如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回 收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄 露. 在 Android 开 ...

  7. 内存优化之一——内存优化工具参数详解

    博客结构 1.背景 2.内存查看方式 (1).AS-Profiler (1).运行框-命令行 3.内存参数 (0)PSS (1)Java heap (2)Native Heap (3)Code (4) ...

  8. android cne服务,Android内存优化-了解内存篇

    查看系统内存 文件 shell@aries:/ $ cat /proc/meminfo MemTotal: 1970216 kB MemFree: 83756 kB Buffers: 156020 k ...

  9. Android内存优化之内存泄漏

    内存泄漏 内存泄漏一般有以下几种情况:单例.静态变量.Handler.匿名内部类.资源使用未关闭 单例导致的内存泄漏 单例的情况主要是因为单例的生命周期比较长,如果引用的一些资源(比如Context. ...

  10. Android内存优化11 内存泄漏常见情况2 线程持久化

    线程持久化 Java中的Thread有一个特点就是她们都是直接被GC Root所引用,也就是说Dalvik虚拟机对所有被激活状态的线程都是持有强引用,导致GC永远都无法回收掉这些线程对象,除非线程被手 ...

最新文章

  1. OpenCV标准霍夫直线检测详解
  2. 八十、归并排序及其分而治之思想
  3. debian安vs_debian下使用vs code
  4. echarts 选中bush中lineX
  5. .NET Core使用FluentEmail发送邮件
  6. 机器与人交流的五大法则
  7. layui框架使用总结
  8. Netty(二)(入门篇)传统的Bio编程
  9. dmb显示服务器断开连接,dmb联网信息发布系统操作手册企业加强版.docx
  10. python源码中的学习笔记_第11章_模块与包
  11. T-Sql - 数据分租求最大指定字段最大的记录
  12. SQLServer 2008数据库查看死锁、堵塞的SQL语句
  13. [Ubuntu 10.04]Firefox中Flash汉字乱码问题的解决
  14. 柯尔莫哥洛夫最后的问题
  15. 移动网络安全_徐州市“移动杯”网络安全技能竞赛 即将开始!
  16. PyTorch实现TPU版本CNN模型
  17. linux测试upnp,UPnP linux新手入门
  18. 猫哥教你写爬虫 034--爬虫-BeautifulSoup实践
  19. HTML meta 标签的使用方式总结(本文总结17中使用方式)
  20. @Resource和@Autowired注解的区别

热门文章

  1. doris core安装报错Makefile:158: recipe for target 'processor.o' failed make: *** [processor.o] Error 1
  2. 系统故障等级和故障报告规定
  3. IT界最伟大的十位人物
  4. 最伟大IT人物10强出炉 乔布斯第一盖茨第三
  5. hp服务器u盘安装系统进不了安装界面,hp笔记本开机无法从u盘安装系统
  6. vim中实现大小写转换
  7. 酷Q机器人,QQ机器人使用教程
  8. 计算机基金经理排名,2019年基金经理排行_2017年一季度 基金经理排行榜大揭秘 规模 盈利 经验...
  9. 使用VLC搭建视频直播服务器
  10. 如何在WORD2007中文档中,奇数页页眉是书名,偶数页页眉是章节。各章章节不同,请详细步骤!!!...