Python内存管理实例分析


Posted in Python onJuly 10, 2019

本文实例讲述了Python内存管理。分享给大家供大家参考,具体如下:

a = 1

a是引用,1是对象。Python缓存整数和短字符串,对象只有一份,但长字符串和其他对象(列表字典)则有很多对象(赋值语句创建新的对象)。

from sys import getrefcount
a=[1,2,3]
print(getfrecount(a))

返回4,当使用某个引用作为参数传给getfrecount时,创建了临时引用,+1.

对象引用对象

class from_obj(object):
  def __init__(self, to_obj):
    self.to_obj = to_obj
b = [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 objgraph
objgraph.show_refs([z], filename='ref_topo.png')

Python内存管理实例分析

千万不要两个对象相互引用或自己引用自己,形成引用环给垃圾回收机制带来麻烦。

垃圾回收

回收引用计数为0的对象。垃圾回收时python不能做其他任务,降低效率,所以不是总随时都垃圾回收。python记录分配对象(object allocation)和取消分配对象(object deallocation),差值高于某阈值启动回收。

import gc
print(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代。

孤立的引用环

Python内存管理实例分析

原本两表对象相互引用后删除引用,但对象引用计数部位0不会被回收。

则python复制每个对象引用计数,对某个对象i,遍历所有对象i引用的对象j,将gc_ref_j减1.

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python logging模块学习笔记
May 24 Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
Python字符串替换实例分析
May 11 Python
python版本的读写锁操作方法
Apr 25 Python
利用python写个下载teahour音频的小脚本
May 08 Python
Python算法之求n个节点不同二叉树个数
Oct 27 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
python-tornado的接口用swagger进行包装的实例
Aug 29 Python
Python中__repr__和__str__区别详解
Nov 07 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
OpenCV 边缘检测
Jul 10 #Python
python使用Qt界面以及逻辑实现方法
Jul 10 #Python
用Python实现BP神经网络(附代码)
Jul 10 #Python
OpenCV 模板匹配
Jul 10 #Python
8种用Python实现线性回归的方法对比详解
Jul 10 #Python
Python实现计算对象的内存大小示例
Jul 10 #Python
Python画图高斯分布的示例
Jul 10 #Python
You might like
php批量删除数据
2007/01/18 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
vue车牌号校验和银行校验实战
2019/01/23 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
从Python程序中访问Java类的简单示例
2015/04/20 Python
python合并同类型excel表格的方法
2018/04/01 Python
详解Python中的四种队列
2018/05/21 Python
儿童学习python的一些小技巧
2018/05/27 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
Python 随机按键模拟2小时
2020/12/30 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
高考寄语大全
2014/04/08 职场文书
我的梦想演讲稿
2014/04/30 职场文书
观看信仰心得体会
2014/09/04 职场文书
违反交通法规检讨书
2014/09/10 职场文书
安全员岗位职责
2015/02/10 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书