Python内存优化,节省内存字典ConstDict

   遇到问题:

        游戏服务器的怪物数据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 False
        
    def 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节省内存的字典数据结构

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些 Python 内存优化的方法: 1. 使用生成器替代列表:当需要创建一个大型列表时,可以使用生成器来逐个生成元素,而不是一次性将所有元素存储在内存中。这可以节省很多内存。 2. 使用迭代器:使用迭代器进行循环操作可以避免将所有元素存储在内存中。这对于处理大型数据集很有用。 3. 删除不必要的对象:当一个对象不再需要时,可以使用 del 关键字将其从内存中删除。这可以减少内存占用。 4. 使用内存映射文件:内存映射文件允许将文件映射到内存中,以便像访问内存一样访问文件。这可以避免将整个文件读入内存中,从而节省内存。 5. 使用 NumPy:NumPy 是一个 Python 库,用于处理大型数组和矩阵。它使用 C 语言实现,因此速度很快,并且可以减少内存占用。 6. 避免循环引用:循环引用指的是两个或多个对象相互引用,导致无法释放内存。可以使用 weakref 库来解决这个问题。 7. 使用垃圾回收:Python 自带了一个垃圾回收机制,用于自动回收不再使用的内存。可以使用 gc 模块来控制垃圾回收。 8. 使用较小的数据类型:使用较小的数据类型可以减少内存占用。例如,使用整数代替浮点数,使用布尔值代替整数等。 9. 将常用数据缓存到内存中:如果经常需要访问某些数据,可以将其缓存到内存中,以避免每次访问时都重新计算。 10. 使用压缩算法:对于大型的文本或二进制数据,可以使用压缩算法来减少内存占用。Python 自带了 zlib 和 gzip 模块,可以用于压缩和解压缩数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值