时间:2021-05-22
本文实例讲述了Python内存管理。分享给大家供大家参考,具体如下:
a = 1a是引用,1是对象。Python缓存整数和短字符串,对象只有一份,但长字符串和其他对象(列表字典)则有很多对象(赋值语句创建新的对象)。
from sys import getrefcounta=[1,2,3]print(getfrecount(a))返回4,当使用某个引用作为参数传给getfrecount时,创建了临时引用,+1.
对象引用对象
class from_obj(object): def __init__(self, to_obj): self.to_obj = to_objb = [1,2,3]a = from_obj(b)print(id(a.to_obj))print(id(b))c = [b,b]a引用对象b,c引用b两次。
通过objgraph包(之前安装xdot)梳理引用拓扑结构。
x = [1, 2, 3]y = [x, dict(key1=x)]z = [y, (x, y)]import objgraphobjgraph.show_refs([z], filename='ref_topo.png')千万不要两个对象相互引用或自己引用自己,形成引用环给垃圾回收机制带来麻烦。
垃圾回收
回收引用计数为0的对象。垃圾回收时python不能做其他任务,降低效率,所以不是总随时都垃圾回收。python记录分配对象(object allocation)和取消分配对象(object deallocation),差值高于某阈值启动回收。
import gcprint(gc.get_threshold())(700,10,10)700为启动阈值,两个10是分代回收相关阈值,通过set_threshold()重设。手动启用垃圾回收gc.collect()。
分代回收
基本假设:存活越久越不可能变垃圾。
对象分0,1,2三代。新建对象0代,经过一次垃圾回收依然存活归为下一代。垃圾回收启动时一定扫描所有0代,如果0代经过一定次数垃圾回收,则扫0和1代,同理扫0,1和2代。(700,10,10)表明10次0代配合1次1代,10次1代配合1次2代。
孤立的引用环
原本两表对象相互引用后删除引用,但对象引用计数部位0不会被回收。
则python复制每个对象引用计数,对某个对象i,遍历所有对象i引用的对象j,将gc_ref_j减1.
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
内存管理:概述在Python中,内存管理涉及到一个包含所有Python对象和数据结构的私有堆(heap).这个私有堆的管理由内部的Python内存管理器保证。P
python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用。python循环引用的变量不会被回收
本文实例讲述了python执行shell获取硬件参数写入mysql的方法。分享给大家供大家参考。具体分析如下:最近要获取服务器各种参数,包括cpu、内存、磁盘、
本文实例讲述了python使用cStringIO实现临时内存文件访问的方法。分享给大家供大家参考。具体分析如下:如果希望从网络读取文件进行处理,但是又不希望保存
本文实例为大家分享了python超市商品销售管理系统的具体代码,供大家参考,具体内容如下需求分析:超市销售管理系统功能1.欢迎用户使用超市销售管理系统,提示用户