python笔记-内存分析

一、小整数池

在交互模式下, 为了提高运行效率, 避免整数反复的创建和销毁而建立的小整数对象池. 定义在区间[-5, 256]之间的整数
[-5, 256]之间的整数对象是提前创建好的, 不会被销毁. 无论在那个作用域, 都是同一个对象

二、字符串驻留机制

字符串驻留:仅保存一份相同且不可变字符串,不同的值被存放在字符串驻留池中
交互模式下, 对于符合标识符规则的字符串(仅包含下划线(_)、字母和数字)会启用字符串驻留机制驻留机制

三、变量

在python中变量是没有类型, 只有当被赋值后变量的类型才会被隐式确定.

所以python变量可以保存任何类型值. 其本质可以理解为c语言中的空指针(void *)

python笔记-内存分析_第1张图片

四、对象的复制

4.1 浅复制

对于相互嵌套的对象的复制. 对外层对象进行复制的时候, 内层对象不会被复制. 复制出来的对象中, 内层对象与原对象的内层对象是同一个对象
python笔记-内存分析_第2张图片

4.2 深复制

对于相互嵌套的对象的复制. 对外层对象进行复制的时候, 内层对象也会被复制. 复制出来的对象中, 内层对象与原对象的内层对象不是同一个对象
python笔记-内存分析_第3张图片

五、内存分区

python笔记-内存分析_第4张图片

六、面向对象内存分析

  1. 对于一个程序中的所有类, 相同的类属性都是引用的同一个对象
    python笔记-内存分析_第5张图片

  2. 类对象的实例对象初始属性
    python笔记-内存分析_第6张图片

    1. 类对象的实例对象中的来自类的属性, 为发生修改时, 和类应用的时同一个对象
    2. 对于不同类对象的实例对象, 如果初始化实例的时候, 对于相同值的属性也是应用同一个对象
    class A:
        a = 10
    
        def __init__(self, name):
            self.name = name
    
    
    class B:
        a = 10
    
        def __init__(self, name):
            self.name = name
    
    
    a = A('dyp')
    b = B('dyp')
    
    print(a.a is A.a)
    print(a.a is b.a)
    print(a.name is b.name)
    

七、垃圾回收机制

7.1 引用计数

python里每一个东西都是对象,它们的核心就是一个结构体:PyObject

typedef struct_object {
     int ob_refcnt;
     struct_typeobject *ob_type;
} PyObject;

PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少。直到ob_refcnt为0时, 对象就会被销毁

你可能感兴趣的:(python笔记-内存分析)