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 时间处理datetime实例
Sep 06 Python
linux系统使用python监测系统负载脚本分享
Jan 15 Python
学习python之编写简单乘法口诀表实现代码
Feb 27 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
python 文件查找及内容匹配方法
Oct 25 Python
在python里面运用多继承方法详解
Jul 01 Python
如何通过雪花算法用Python实现一个简单的发号器
Jul 03 Python
pytorch多进程加速及代码优化方法
Aug 19 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 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
无线电广播的开始
2002/01/30 无线电
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP 分页类(模仿google)-面试题目解答
2009/09/13 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
在HTML代码中使用JavaScript代码的例子
2014/10/16 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
vue实现简单图片上传
2020/06/30 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
查看Django和flask版本的方法
2018/05/14 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python写程序统计词频的方法
2019/07/29 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
Django app配置多个数据库代码实例
2019/12/17 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
Linux的文件类型
2012/03/07 面试题
大专毕业生自我评价分享
2013/11/10 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL
python tqdm用法及实例详解
2021/06/16 Python
TypeScript 内置高级类型编程示例
2022/09/23 Javascript