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中文编码问题小结
Sep 28 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
在Python的Django框架中加载模版的方法
Jul 16 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
对Python subprocess.Popen子进程管道阻塞详解
Oct 29 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
解决python gdal投影坐标系转换的问题
Jan 17 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 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
剖析 PHP 中的输出缓冲
2006/12/21 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
htm调用JS代码
2007/03/15 Javascript
javascript+xml技术实现分页浏览
2008/07/27 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python查看zip包中文件及大小的方法
2015/07/09 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
python进度条显示之tqmd模块
2020/08/22 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
物流仓储计划书
2014/01/10 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
2014年稽查工作总结
2014/12/20 职场文书
委托书的样本
2015/01/28 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
军训通讯稿范文
2015/07/18 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android