zoukankan      html  css  js  c++  java
  • 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实用编程技巧进阶

  • 相关阅读:
    HBase原理和架构
    Hive UDF作业
    Hive性能调优
    hive
    Netty4.0学习笔记系列之一:Server与Client的通讯
    JAVA NIO 简介(转)
    设计模式之观察者模式(Observer Pattern)
    设计模式之装饰者模式(Decorator Pattern)
    mysql存储过程写法—动态参数运用
    hashCode() 和equals() 区别和作用
  • 原文地址:https://www.cnblogs.com/marton/p/10778030.html
Copyright © 2011-2022 走看看