关于python中|关于python中 内存的处理与分析

内存处理
关于内存的处理与分析
[if !supportLists]1.[endif]内存的分配
[if !supportLists]l[endif]对象的创建,依赖于申请内存空间中数据的加载,对象在内存中的创建依赖于三部分
[if !supportLists]?[endif]内存的处理:对象内存的地址、引用变量分配内岑的地址、对象和引用变量之间关联
由于对象的创建,是将堆内存中创建的对象地址临时存储在栈内存的变量中,那么在程序中如果要在多个地方使用一个对象就要通过开发者能熟悉的硬、软件对于内存的处理。
[if !supportLists]l[endif]软件程序在计算机中执行,主要通过数据单元、控制单元、执行单元共同协作,完成数据的交互,达到程序处理数据的目的。所以在python程序在运行的时候,主要从解释器从系统申请内存空间以及运行python软件解释器手机爱能够申请的内存主要区分为这样几个部分
[if !supportLists]l[endif]堆内存(heep)
[if !supportLists]l[endif]栈内存区(Stack)
[if !supportLists]l[endif]静态区|常量区(static)
[if !supportLists]l [endif]方法区|数据区(data)
[if !supportLists]l[endif]不可变数据类型&可变数据类型
1.2:不可变数据类型:一般基本数据都是不可变类型eg: strint
1.3:可变数据类型:组合数据类型或自定义数据类eg: listdaic
怎么区分可变和不可变?为什么要有这样的规则?
Python中的一切对象,可以通过id()函数查寻对象在内存中地址数据
可变数据类型都是在定义了数据之后,修改变量的数据,内存地址不会发生变化
1.4:代码和代码块
Python中的最小运行单元是代码块,代码块会独立申请内存
1.5:python对内存的操作,社区开发一款比较强大的模块作为一个代码块向系统申
【关于python中|关于python中 内存的处理与分析】请,关于memory_profie是一个使用较为简单,并且可视化比较直观的工具模块,通过pip 工具安装即可使用。
pip install memory_profiler
Form memory_profiler import profile
@profile
def chg_data_1():
x = 12
print(“method:{}”.format(x))






程序内存代码检测
代码is 、== 、isinstance使用
前面看过了变量以及对象在内存中的分配和执行情况,那么在程序执行过程中,怎么判断对象和对象之间的关系,Python 提供对象操作符号is 和内容操作符号== ,用于判断对象和对象的值的情况
引用浅拷贝、深拷贝
对象的浅拷贝
3.11对象的浅拷贝
对于程序中对象的拷贝操作,吃了前面介绍的引用赋值操作可以完成同一个对象在程序不同
位置的操作,这里的浅拷贝更是一个对象的临时备份,浅拷贝的核心机制主要是赋值对象内部数据的应用的引用。


对象的深拷贝
3.12 对象的深拷贝
和队象的浅拷贝不同,对象的深拷贝,是对象数据的直接拷贝,而不是简单引用拷贝,主要是通过python 内建表模块copy提供deepcopy函数可以对象深拷贝


Python中垃圾回收机制
引用计数
引用计数(Reference CountingRC)是python 中的垃圾回收机制的核心操作算法
该算法最早在1960年首次提出,并在大部分高级语言中沿用至今,是很高级语言的垃圾核心算法之一。
引用计数算法的核心思想是:当一个对象被创建或者拷贝时,引用计数就会+1,当这个对象
的多个引用变量,被销毁一个时该对象的引用计数就会—1,如果一个对象的引用计数为则表示该对象已经不被引用,就可以让垃圾回收机制进行清除释放该对象战友的内存空间了

标记清除
Python 中的标记-清除机制主要针对可能产生循环引用的对象进行的检测
在python 中的基本不可变类型如 pyintobject ,pystringobject 等对象的内部不会内聚其他
内聚其他对象的引用,所以不会产生循环引用,一般情况下循环引用总是发生在其他可变对象的内部属性中,如list dictclass等待,使得该方法消耗的资源和程序中可变对象的数量息息相关!


分代回收
Python 中的分代是一种空间换取时间效率的做法,python内部处理的机制定义了三个不同的链表数据结构,在程序中对象往往的更快,年老的对象往往存活更久
??????&?q??c

    推荐阅读