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 相关文章推荐
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
python模拟表单提交登录图书馆
Apr 27 Python
Python装饰器模式定义与用法分析
Aug 06 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
对django后台admin下拉框进行过滤的实例
Jul 26 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
pytorch 6 batch_train 批训练操作
May 28 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
JS模块与命名空间的介绍
2013/03/22 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
chrome下jq width()方法取值为0的解决方法
2014/05/26 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
一文解决django 2.2与mysql兼容性问题
2020/07/15 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
绘画设计学生的个人自我评价
2013/09/20 职场文书
心理健康教育心得体会
2013/12/29 职场文书
给导游的表扬信
2014/01/10 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
检讨书范文1000字
2015/01/28 职场文书
学生通报表扬范文
2015/05/04 职场文书
最感人的道歉情书
2015/05/12 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
Win10 Anaconda安装python-pcl
2022/04/29 Servers