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的Django框架中的中间件
Jul 24 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
Python面向对象类继承和组合实例分析
May 28 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Pycharm创建项目时如何自动添加头部信息
Nov 14 Python
python深copy和浅copy区别对比解析
Dec 26 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
python如何运行js语句
Sep 09 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 Python
pandas数据分组groupby()和统计函数agg()的使用
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
基于mysql的论坛(7)
2006/10/09 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
extjs之去除s.gif的影响
2010/12/25 Javascript
JQuery AJAX 中文乱码问题解决
2013/06/05 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
Python爬虫模拟登录带验证码网站
2016/01/22 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
python单例模式的多种实现方法
2019/07/26 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
物流专业大学的自我评价
2014/01/11 职场文书
优秀求职信范文分享
2014/01/26 职场文书
高中生旷课检讨书
2014/10/08 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js