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实现的爬虫功能代码
Jun 24 Python
python实现批量修改文件名代码
Sep 10 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
python执行精确的小数计算方法
Jan 21 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
Pandas读取并修改excel的示例代码
Feb 17 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
Python netmiko模块的使用
Feb 14 Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 Python
python 实现图片批量压缩的示例
Dec 18 Python
Python Pandas常用函数方法总结
Jun 15 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
Terran兵种对照表
2020/03/14 星际争霸
PHP 创建标签云函数代码
2010/05/26 PHP
php处理json时中文问题的解决方法
2011/04/12 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
基于jquery的超简单上下翻
2010/04/20 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
Python求凸包及多边形面积教程
2020/04/12 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
运动会入场解说词300字
2014/01/25 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
会计系毕业生求职信
2014/05/28 职场文书
2014年双拥工作总结
2014/11/21 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python