1.1.内存分析
初学python时,运行python程序时,我们大部分只关注运算的结果的正确性,很少会去想当python源代码运行在python解释器中,是怎样运行的?
计算机运行一个程序
- python 源代码[.py文件,源代码] 解释处理 ->得到字节码【二进制数据】,生成.pyc文件【临时文件】-> 运行【将二进制数据,加载到内存】->
- 运算【提取关键数据,参与运算,得到结果】
- 渲染展示到界面上
程序/软件的运行【核心机制】
- 源代码程序【语义化(用自然语言)的定义类数据、流程等控制单元】
- 内存操作【加载内存–>变量/函数/类型/方法…】
- 运算处理【执行运算的过程,需要提取数据执行运算(按照流程进行逻辑控制)】
所有的软件,不论编程语言是c、java、c#等等,都是按照上的运行机制运行的。那么既然是这样,为什么还要分析运行过程的内存?
因为所有的资源都是有限的,包括硬件资源,如果想要在有限的硬件资源上,运行尽可能多的软件,需要有效的利用内存空间【软件运行时,需要内存空间,若空间不足以满足软件运行所需要的空间,那么软件将不会执行或以最简的方式运行(软件界面可能会出现卡顿、断帧等现象,运行不流畅)】
计算机的结构相对于刚接触的人来说比较复杂,很难了解内部结构。内存属于计算机的硬件部分,所以这里大致说一下计算机的硬件:
计算机硬件【内存|硬件都为8G】
- 操作系统【系统软件】:控制和管理硬件系统,完成软件数据处理 (每一台计算机都会有操作系统[windows/mac/linux])
- 使用硬件内存运行操作系统软件【2G已用|6G可用】
- 直接分配内存空间,操作使用内存数据
- 应用软件:执行各种业务相关的数据运算【每一个软件运行,都需要内存】
应用软件运行时:
1,向操作系统申请内存,操作系统给对应的软件分配内存
2,软件在申请到的内存中分配数据,加载数据,完成软件的执行
===================================
软件的运行,需要将软件数据加载到内存中
1.2.PYTHON 中的内存处理
我们都知道python需要一个开发/运行的环境,开发好的python程序可以通过执行命令执行
python XXX.py
一个程序或软件中的数据有很多,当加载数据时,在申请到的内存空间里,数据可能会比较混乱,不利于程序的执行,也会浪费很大的空间。
为了提高程序的执行效率和有效的利用内存空间,将申请到的内存空间进行了区域划分
- 栈内存(变量)和堆内存(对象)
- 栈内存:数据不稳定,分配/释放效率高;
- 堆内存:数据稳定(一旦建立,基本上直到程序结束才释放),分配/释放消耗资源大
堆内存:数据稳定(一旦建立,基本上直到程序结束才释放),分配/释放消耗资源大】- 静态区/常量区:不可变类型的参数【存放常驻内存的数据】
- 数据区/方法区:函数/方法/类型…【加载代码对应的二进制数据】
在计算机上运行demo01.py文件,先通过解释器项计算机申请内存,这里python解释器展568M,但分给python程序的却只有2M【】
代码演示demo01
>>> x = 12
>>> y = 15
>>> z = x + y
>>>
>>> z
27
>>> m = 27
>>> m
27
>>> id(x)
140727564690608
>>> id(y)
140727564690704
>>> id(z)
140727564691088
>>> id(m)
140727564691088
代码演示demo02
def back(m):
m.append('10')
def back2(n):
n = 12
if __name__ == "__main__":
a = [20]
b = 20
back(a) # ? 发生了什么
back2(b) # ? 发生了什么
print(a) # [20, '10']!? 什么结果 A[20, '10']? B[20]? C['10']?
print(b) # 20!? 什么结果 A20? B12? C2012?