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正则表达式中的括号匹配问题
Dec 14 Python
Django添加feeds功能的示例
Aug 07 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
django正续或者倒序查库实例
May 19 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
Python xlrd/xlwt 创建excel文件及常用操作
Sep 24 Python
最新pycharm安装教程
Nov 18 Python
python Zmail模块简介与使用示例
Dec 19 Python
如何使用python包中的sched事件调度器
Apr 30 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
极典R601SW收音机
2021/03/02 无线电
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
Python的类实例属性访问规则探讨
2015/01/30 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
Python json读写方式和字典相互转化
2020/04/18 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
行政助理岗位职责范文
2013/12/03 职场文书
店长职务说明书
2014/02/04 职场文书
房产委托公证书样本
2014/04/04 职场文书
安全责任书范本
2014/04/15 职场文书
小学生校园广播稿
2014/09/28 职场文书
租赁协议书
2015/01/27 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
Node.js实现断点续传
2021/06/23 Javascript
Nginx配置根据url参数重定向
2022/04/11 Servers