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操作列表之List.insert()方法的使用
May 20 Python
Python实现图像几何变换
Jul 06 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
Python实现获取磁盘剩余空间的2种方法
Jun 07 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
Python插件机制实现详解
May 04 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
详解python算法常用技巧与内置库
Oct 17 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
php5数字型字符串加解密代码
2008/04/24 PHP
php中异常处理方法小结
2015/01/09 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
php常用图片处理类
2016/03/16 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
jquery 可排列的表实现代码
2009/11/13 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
js常用代码段整理
2011/11/30 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
举例详解Python中的split()函数的使用方法
2015/04/07 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
详解Python中的Lock和Rlock
2021/01/26 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
十八大报告观后感
2014/01/28 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
维稳工作承诺书
2015/01/20 职场文书
员工离职感谢信
2015/01/22 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书