请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Python深入之python内存管理机制(重点)

[复制链接]
查看: 55|回复: 0

1万

主题

2万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
47993
发表于 2019-12-4 01:25 | 显示全部楼层 |阅读模式
前言

本文的翰墨及图片根源于收集,仅供进修、交换操纵,不具有任何贸易用处,版权归原作者全数,若有题目请实时联系我们以作处置惩罚。


作者:醍醐三叶
关于python的存储题目,
(1)由于python中万物皆工具,所以python的存储题目是工具的存储题目,而且对于每个工具,python会分派一块内存空间去存储它
(2)对于整数和短小的字符等,python会实行缓存机制,行将这些工具举行缓存,不会为类似的工具分派多个内存空间,假如对我讲的还不懂,说明你根柢学的还不是和很好,可以去小编的Python交换.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面很多最新Python精讲的教程项目。
(3)容器工具,如列表、元组、字典等,存储的其他工具,仅仅是其他工具的援用,即地点,并不是这些工具自己
关于援用计数器
(1)一个工具会记录着援用自己的工具的个数,每增加一个援用,个数加一,每淘汰一个援用,个数减一
(2)检察援用工具个数的方式:导入sys模块,操纵模块中的getrefcount(工具)方式,由于这里也是一个援用,故输出的结果多1
(3)增加援用个数的情况:1.工具被建立p = Person(),增加1;2.工具被援用p1 = p,增加1;3.工具被看成参数传入函数func(object),增加2,原因原由是函数中有两个属性在援用该工具;4.工具存储到容器工具中l = [p],增加1
(4)淘汰援用个数的情况:1.工具的别名被烧毁del p,淘汰1;2.工具的别名被赋予其他工具,淘汰1;3.工具离开自己的感化域,如getrefcount(工具)方式,每次用完后,其对工具的那个援用就会被烧毁,淘汰1;4.工具自在器工具中删除,大要容器工具被烧毁,淘汰1
(5)援用计数器用法:
  1. import sysclass Person(object):    passp = Person()p1 = pprint(sys.getrefcount(p))p2 = p1print(sys.getrefcount(p))p3 = p2print(sys.getrefcount(p))del p1print(sys.getrefcount(p))
复制代码
多一个援用,结果加1,烧毁一个援用,结果淘汰1
(6)援用计数器机制:操纵援用计数器方式,在检测到工具援用个数为0时,对平常的工具举行开释内存的机制
关于循环援用题目,假如对我讲的还不懂,说明你根柢学的还不是和很好,可以去小编的Python交换.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面很多最新Python精讲的教程项目。
(1)循环援用即工具之间举行相互援用,出现循环援用后,操纵上述援用计数机制没法对循环援用中的工具举行开释空间,这就是循环援用题目
(2)循环援用形式:
  1. class Person(object):    passclass Dog(object):    passp = Person()d = Dog()p.pet = dd.master = p
复制代码
即工具p中的属性援用d,而工具d中属性同时来援用p,从而形成仅仅删除p和d工具,也没法开释其内存空间,由于他们仍然在被援用。深入表白就是,循环援用后,p和d被援用个数为2,删除p和d工具后,两者被援用个数变成1,并不是0,而python只要在检查到一个工具的被援用个数为0时,才会自动开释其内存,所以这里没法开释p和d的内存空间
关于渣滓采取(底层层面--道理)
(1)渣滓采取的感化:从经过援用计数器机制后还没有被开释掉内存的工具中,找到循环援用工具,并开释掉其内存
(2)渣滓采取检测流程:
一.任何找到循环援用并开释内存:1.收集全数容器工具(循环援用只针对于容器工具,其他工具不会发生循环援用),操纵双向链表(可以看做一个聚集)对这些工具举行援用;2.针对每一个容器工具,操纵变量gc_refs来记录当前对应的利用个数;3.对于每个容器工具,找到其正在援用的其他容器工具,并将这个被援用的容器工具援用计数减去1;4.经过步伐3后,检查全数容器工具的援用计数,若为0,则证实该容器工具是由于循环援用存活下来的,并对其举行烧毁
二.怎样提拔查找循环援用进程的性能:由一可知,循环援用查找和烧毁进程很是烦琐,要别离处置惩罚每一个容器工具,所以python考虑一种改良性能的做法,即分代采取。首先是一个假定--假如一个工具被检测了10次还没有被烧毁,就淘汰对其的检测频次;基于这个假定,提出一套机制,即分代采取机制。
Python深入之python内存管理机制(重点)  游戏

经过这个机制,循环援用处置惩罚进程就会获得很大的性能提拔
关于渣滓采取机遇(利用层面--重点)
(1)自动采取:
Python深入之python内存管理机制(重点)  游戏

(2)手动采取:这里要操纵gc模块中的collect()方式,使得实行这个方式时实行分代采取机制
  1. import objgraphimport gcimport sysclass Person(object):    passclass Dog(object):    passp = Person()d = Dog()p.pet = dd.master = pdel pdel dgc.collect()print(objgraph.count("Person"))print(objgraph.count("Dog"))
复制代码
其中objgraph模块的count()方式是记录当前类发生的实例工具的个数
关于内存治理机制的总结(重点)
综上所述,python的内存治理机制就是援用计数器机制和渣滓采取机制的肴杂机制

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表