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中运行并行任务技巧
Feb 26 Python
python中迭代器(iterator)用法实例分析
Apr 29 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
基于DataFrame改变列类型的方法
Jul 25 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
Jul 19 Python
pycharm配置git(图文教程)
Aug 16 Python
python实现大学人员管理系统
Oct 25 Python
Python如何在DataFrame增加数值
Feb 14 Python
如何基于windows实现python定时爬虫
May 01 Python
一篇文章弄懂Python中的内建函数
Aug 07 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读取大文件的几种方法介绍
2016/10/27 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
javascript模块化简单解析
2016/04/07 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python中优化NumPy包使用性能的教程
2015/04/23 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
春季运动会广播稿大全
2014/02/19 职场文书
班级年度安全计划书
2014/05/01 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
2015年领班工作总结
2015/04/29 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
文化大革命观后感
2015/06/17 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python