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进阶教程之文本文件的读取和写入
Aug 29 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
May 08 Python
Python利用requests模块下载图片实例代码
Aug 12 Python
python 叠加等边三角形的绘制的实现
Aug 14 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
python接入支付宝的实例操作
Jul 20 Python
详解解决jupyter不能使用pytorch的问题
Feb 18 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
Python生成九宫格图片的示例代码
Apr 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提取中文首字母
2008/04/09 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
PHP处理会话函数大总结
2015/08/05 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
[原创]图片分页查看
2006/08/28 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
理解Javascript闭包
2013/11/01 Javascript
js脚本实现数据去重
2014/11/27 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python面向对象编程基础解析(一)
2017/10/26 Python
python根据时间获取周数代码实例
2019/09/30 Python
python小项目之五子棋游戏
2019/12/26 Python
pycharm实现猜数游戏
2020/12/07 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
英国电子专家:maplin
2019/09/04 全球购物
函授本科毕业生自我鉴定
2013/10/16 职场文书
活动总结怎么写啊
2014/05/07 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
乒乓球比赛通知
2015/04/27 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
Golang 对es的操作实例
2022/04/20 Golang