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通过PIL获取图片主要颜色并和颜色库进行对比的方法
Mar 19 Python
python中的格式化输出用法总结
Jul 28 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
运行django项目指定IP和端口的方法
May 14 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
python3.x实现base64加密和解密
Mar 28 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
关于pycharm中pip版本10.0无法使用的解决办法
Oct 10 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 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 结果集的分页实现代码
2009/03/10 PHP
php常用表单验证类用法实例
2015/06/18 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Windows下安装python2.7及科学计算套装
2015/03/05 Python
Python制作简易注册登录系统
2016/12/15 Python
python读取文本中的坐标方法
2018/10/14 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
python opencv实现简易画图板
2020/08/27 Python
python实现三壶谜题的示例详解
2020/11/02 Python
一套SQL笔试题
2016/08/14 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
运动会广播稿100字
2014/01/11 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
竞选村长演讲稿
2014/04/28 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
最美护士演讲稿
2014/08/27 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
Python 中 Shutil 模块详情
2021/11/11 Python