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进阶教程之词典、字典、dict
Aug 29 Python
python实现一次创建多级目录的方法
May 15 Python
Python标准库之Sys模块使用详解
May 23 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
Python优先队列实现方法示例
Sep 21 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
python分数表示方式和写法
Jun 26 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 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脚本的10个技巧(8)
2006/10/09 PHP
PHP下几种删除目录的方法总结
2007/08/19 PHP
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python爬虫面试宝典(常见问题)
2018/03/02 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
Python线程threading模块用法详解
2020/02/26 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
java字符串格式化输出实例讲解
2021/01/06 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
大学生职业生涯规划方案
2014/01/03 职场文书
运动会广播稿30字
2014/01/21 职场文书
餐厅考勤管理制度
2014/01/28 职场文书
企业总经理岗位职责
2014/02/13 职场文书
机关党员公开承诺书
2014/08/30 职场文书
教师节获奖感言
2015/07/31 职场文书
社区服务理念口号
2015/12/25 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis
JavaScript 原型与原型链详情
2021/11/02 Javascript