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 相关文章推荐
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
AI人工智能 Python实现人机对话
Nov 13 Python
Python通过Pygame绘制移动的矩形实例代码
Jan 03 Python
python3使用matplotlib绘制条形图
Mar 25 Python
Python 导入文件过程图解
Oct 15 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
django框架auth模块用法实例详解
Dec 10 Python
django 扩展user用户字段inlines方式
Mar 30 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
Python爬虫requests库多种用法实例
May 28 Python
python中线程和进程有何区别
Jun 17 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 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中使用PDF文档功能
2006/10/09 PHP
php下删除字符串中HTML标签的函数
2008/08/27 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
关于element的表单组件整理笔记
2021/02/05 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
Python模块学习 filecmp 文件比较
2012/08/27 Python
Python 统计字数的思路详解
2018/05/08 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
学生处主任岗位职责
2013/12/01 职场文书
索桥的故事教学反思
2014/02/06 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
安全环保标语
2014/06/09 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS