2018-08-22

1.内存分析与处理

程序的运行离不开对内存的操作,一个软件要运行,需要将数据加载到内存中,
通过cpu进行内存数据的读写,完成数据的运算。

2.程序内存浅析

软件程序在计算机中执行,主要通过数据单元,控制单元,执行单元共同协作,完成数据的交互。
python程序运行,主要是解释器从系统中申请内存空间来运行
python软件解释器将申请的内存主要分为以下几部分来处理执行程序软件:

栈内存(stack) 用于直接分配数据,存取速度快,数据存储不稳定,适用小数据块的快速存取,一般在程序中存储变量数据

方法区(data):加载程序使用的代码数据,二进制数据,方法数据等程序运行需要的预加载数据

静态区(static):用于加载存储程序中一些静态数据,常量数据等,在python中不可变数据也会存储在静态常量中

堆内存(heap):存储数据稳定,一般用于存储加载比较重量级数据,例如程序运行过程中的对象

3.不可变数据类型和可变数据类型

一般基本数据类型都是不可变数据乐行。
一般组合数据类型或者自定义数据类型都是可变数据类型。

3.1可变或者不可变,为什么有这样的规则?
python中一切都是对象,可以通过id()函数查询对象在内存中的地址数据,可变数据类型是在定义数据后,修改变量数据,内存地址不会发生变化。 不可变数据类型是定义数据后,修改变量数据,变量不会改变原来内存地址的数据 而是会指向新的地址,原有数据保留,方便基本数据的利用率。

4.代码块

python中最小的运行单元是代码块,代码块最小单元是一行代码。
实际开发过程中,需要注意python两种操作方式: (1):交互模式
(2):ide开发模式

在交互模式下,每行命令是一个独立代码块,每个代码块运行会独立申请一次内存,在操作过程中交互模式没有退出情况下遵循python官方操作标准。
例如,在整数-5到256之间的数据自动缓存,字符串自动缓存,他们的地址一样,超出范围的数据需要重新申请内存,地址数据不一样。

在IDE开发模式下,代码封装在模块中,通过python命令运行模块时,模块整体作为一个代码块向系统申请内存并执行程序,地址数据没有改变。

3.2 程序内存代码检测
python对于内存操作,社区开发一款强大的专门用于检测代码的,用于
代码调优的模块memory_profile
是一个比较简单,并且可视化工具,通过pip install memory_profile安装即可。

通过在测试的函数或者类型前面添加@profile注解,让内存分析模块直接可以进行代码运行监测

3.3 操作符号 is和==的使用
用于判断对象和对象中的值的情况
a is b : 判断对象a 和对象b 是否同一个地址,即同一个对象
a==b: 判断a中内容是否和b中内容一致
无论基本类型数据 还是内容复杂对象 都可以通过对象判断is 和内容判断操作符号==来确定

引入数据类型的操作:自定义数据类型,变量中存放的是对象在内存中的地址
自定义类型的对象,每次创建同样也是在堆内存中单独创建的对象,所以 is 判断 False

3.4 引用,浅拷贝,深拷贝
(1)对象的内存分配
对象的创建,依赖于申请的内存空间中数据的加载,对象在内存中的创建过程依赖于3部分
内存处理:对象分配内存地址,引用变量分配内存地址,对象和引用变量之间的关联。
对象的创建是将堆内存中创建的对象地址临时存储在栈内存变量中,如果程序在多个地方使用
一个对象数据应该怎么办? 复制
python对于这种情况,有三种不同的操作方式:
1.如果程序中多个不同地方使用同一个对象,通过对象的引用赋值,将同一个对象赋值给
多个变量
2.如果程序中多个不同地方都使用相同对象数据,通过对象拷贝完成数据的简单复制就可以
对象中包含数据要求必须一致。
3.如果程序中多个不同地方使用相同而且独立的对象数据,通过对象深层复制将对象数据
完整复制成独立一份即可。

     (2)对象的引用赋值

可以将对象的内存地址同时赋值给多个变量,这多个变量存放的都是同一个对象引用地址
如果通过一个变量修改对象内容,那么其他变量也指向的对象内容同步改变。
对象的引用变量赋值 a=[1,2,3] b=a
被赋值的变量b 变量a 指向同一个列表对象 a=[1,2,3] b=[1,2,3]

通过引用变量a修改对象数据 通过引用变量b查看到也是修改后数据
a.append(5)
a=[1,2,3,5] b=[1,2,3,5]

对象的引用变量赋值 并不是对象的复制或者备份 只是将对象的地址存储在多个变量中
方便程序操作

注意: python中对象的引用赋值,针对可变类型 组合数据类型或者自定义class类型都具备
引用赋值操作,不过不适合不可变类型,一旦通过变量重新赋值会指向新的引入对象。

(3)对象的浅拷贝
核心机制是主要赋值对象内部数据的引用
python内建标准模块copy提供一个copy函数完成

(4)对象的深拷贝
对象的深拷贝是对象数据的直接拷贝,而不是简单的引用拷贝,通过python内建模块copy
提供的deepcopy函数完成

3.5 垃圾回收机制

垃圾回收机制(Garbage Collection:GC)基本是所有高级语言的标准配置之一
一定程度上可以优化编程语言数据处理效率 提高编程开发软件安全性能

python中 垃圾回收机制 主要以 引用计数 为主要手段
以标记清除和隔代回收机制为辅助操作手段
完成对内存中无效数据的自动管理操作

3.5.1 引用计数
引用计数(Reference Counting:RC)是python垃圾回收机制的核心操作算法
(1)引用计数的概念
核心思想:当一个对象被创建或者拷贝时,引用计数+1,当这个对象多个引用变量,被销毁
一个时该对象引用计数-1,如果一个对象的引用计数为0表示该对象不被引用,可以让垃圾
回收机制清除并释放该对象占有的内存空间。

引用计数 优点: 操作简单,实时性能优秀,能在短时间获得并运算对象引用计数

缺点: 为了维护每个对象引用计数算法,python必须提供和对象对等的内存消耗来维护引用
计数,无形增加内存负担。同时引用计数对于循环应用 对象之间互相引用,是无法进行引入
计数操作的,会造成常驻内存。

(2)python中的引用计数
python是一个面向对象的弱类型语言,所有的对象都是直接或者间接继承object类型,
object类型核心其实是一个结构对象。

3.5.2 标记清除
python中的标记 清除机制 主要是针对可能产生循环引用的对象进行的检测机制
一般情况下循环引用总是发生在其他可变对象的内部属性中,如list,dict,class等
使得该方法消耗的资源和程序中可变对象的数量有关。

标记清除核心思想:首先找到 PYTHON 中的一批根节点对象,如 object 对象,通过根
节点对象可以找到他们指向的子节点对象,如果搜索过程中有这个指向是从上往下的指向,
表示这个对象是可达的,否则该对象是不可达的,可达部分的对象在程序中需要保留下来,
不可达部分的对象在程序中是不需要保留的

3.5.3 分代回收
python中分代回收机制,是一种通过空间换取时间效率的做法,PYTHON 内部处理机制
定义了三个不同的链表数据结构[第零代(年轻代),第 1 代(中年代),第 2 代(老年代)]
PYTHON 为了提高程序执行效率,将垃圾回收机制进行了阈值限定,0 代链表中的垃圾
回收机制执行最为密集,其次是 1 代,最后是 2 代;

备注:弱代假说:程序中年轻的对象往往死的更快,年老的对象往往存活更久

3.5.4 垃圾回收处理
PYTHON 中的 gc 模块提供了垃圾回收处理的各项功能机制,必须 import gc 才能使用
gc.set_debug(flags):设置gc的debug日志,一般为gc.DEBUG_LEAK
gc.collect([generation]):显式进行垃圾回收处理,可以输入参数~参数表示回收的对
象代数,0 表示只检查第 0 代对象,1 表示检查第 0、1 代对象,2 表示检查 0、1、2 代独
对象,如果不传递参数,执行 FULL COLLECT,也就是默认传递 2
gc.set_threshold(threshold0 [, threshold2 [, threshold3]]):设置执行垃圾回
收机制的频率
gc.get_count():获取程序对象引用的计数器
gc.get_threshold():获取程序自动执行 GC 的引用计数阈值

在程序开发过程中,需要注意:
项目代码尽量避免循环引用
引入gc模块,启动gc模块自动清理循环引用对象的机制
将需要长期使用的对象集中管理,减少 GC 资源消耗
gc 模块处理不了重写del方法导致的循环引用,如果一定要添加该方法,需要显式
调用 gc 模块的 garbage 中对象的del方法进行处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 3,800评论 0 27
  • Android 内存管理的目的 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。简单粗...
    晨光光阅读 1,286评论 1 4
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,183评论 11 349
  • 作者:曾铁城 “爸爸,如果在竞技比赛中,自己处于被动时,有没有什么办法摆脱困境呢?” “这要看情况了,如果双方实力...
    小城28阅读 204评论 0 1
  • 最近天气总是阴雨连绵许久不见阳光,晒在阳台外的衣服总是好些天干不了,这些往往都是造成我心情不好的主要因素之一。...
    八荒阿阅读 241评论 0 0