• python类与对象-如何为创建大量实例节省内存


    如何为创建大量实例节省内存

    问题举例

    在网络游戏中,定义玩家类Player(id, name, level...),

    每个玩家在线将创建一个Player实例,当在线人数很多时,将产生大量实例,

    如何降低这些实例的内存开销?

    分析

    通过类创建的对象一般有一个__dict__属性,它是一个字典,

    在添加属性时创建,主要用来维护动态添加的属性,__dict__非常消耗内存

    解决思路

    定义类的__slots__属性,声明实例有哪些属性,提前分配内存空间,但是同时也关闭了动态添加属性的功能

    代码

    通过tracemalloc模块查看两个类创建100000实例所占用内存的对比

    import tracemalloc
    class Player1():
        __slots__ = ['uid', 'name', 'level']
        def __init__(self, uid, name, level):
            self.uid = uid
            self.name = name
            self.level = level
    
    class Player2():
        def __init__(self, uid, name, level):
            self.uid = uid
            self.name = name
            self.level = level
    
    tracemalloc.start()
    # start 
    #la = [Player1(1,'tom',3) for _ in range(100000)]
    #D:python	est.py:0: size=7056 KiB, count=100002, average=72 B
    #C:PythonPython37lib	racemalloc.py:0: size=64 B, count=1, average=64 B
    #[Finished in 0.9s]
    
    lb = [Player2(1,'tom',3) for _ in range(100000)]
    #D:python	est.py:0: size=16.8 MiB, count=299994, average=59 B
    #C:PythonPython37lib	racemalloc.py:0: size=64 B, count=1, average=64 B
    #[Finished in 1.7s]
    # end
    snapshot = tracemalloc.take_snapshot()
    top_stats = snapshot.statistics('filename')
    for stat in top_stats[:10]: print(stat)

    参考资料:python3实用编程技巧进阶

  • 相关阅读:
    一站式学习Wireshark第六章
    一站式学习Wireshark第七章
    一站式学习Wireshark第八章
    一站式学习Wireshark第九章
    一站式学习Wireshark第十章
    一站式学习Wireshark第一章
    第二周的学习进度
    架构漫谈随笔
    淘宝网描绘质量属性六个常见属性场景
    二月十五日
  • 原文地址:https://www.cnblogs.com/marton/p/10778030.html
Copyright © 2020-2023  润新知