python学习笔记10(Python的内存管理)
2016-05-11 14:35
543 查看
用这张图激励一下自己,身边也就只有一位全栈数据工程师!!!
32. Python的内存管理
1. 对象的内存使用
对于整型和短字符串对象,一般内存中只有一个存储,多次引用。其他的长字符串和其他对象,对象就有相同的多份存储。查看对象的内存存储,可以用内置函数id().比如:
a=1 b=1 print(id(a), id(b)) # 相同 a='a very good morning' b='a very good morning' print(id(a), id(b)) # 不相同
也可以用 is 关键字 来验证两个引用是否是同一个对象。
a='a very good morning' b='a very good morning' print(a is b) # False
每个对象都有指向该对象的引用,可以用 sys包中的getrefcount(),来查看某个对象的引用计数。
注意:getrefcount()所得到的结果,会比期望的多1(因为引用作为参数传递给getrefcount()使用时,相当于创建了一个临时引用)。
2. 对象引用对象
Python的一个容器对象(container),比如表、词典等,可以包含多个对象。实际上,容器对象中包含的并不是元素对象本身,是指向各个元素对象的引用。容器对象的引用可能构成复杂的拓扑结构,如引用环,增加垃圾回收的复杂性。
不甚理解,以后再看。http://www.cnblogs.com/vamei/p/3232088.html
globals() 可以查看记录了所有全局引用的字典。
locals() 可以查看记录了局部引用的字典。
引用环
3. 引用减少
del 删除某个引用:from sys import getrefcount a = [1, 2, 3] b = a print(getrefcount(b)) del a print(getrefcount(b))
如果某个引用指向对象A,当这个引用被重新定向到某个其他对象B时,对象A的引用计数减少:
不懂
4.Python的垃圾回收
garbage collection 将没用的对象清除。1)从基本原理上,当Python的某个对象的引用计数降为0时,那么该对象内存就会被清空。
2)Python只会在特定条件下,自动启动垃圾回收。
通过gc模块的get_threshold()方法,查看阈值:
import gc print(gc.get_threshold()) #(700,10,10)
其中700就是阈值,代表分配对象(object allocation)和取消分配对象(object deallocation)的次数差值,高于某个阈值时,垃圾回收才会启动。
可以通过gc中的set_threshold()方法重新设置。
3)手动启动垃圾回收,即使用gc.collect()。
4)分代回收 generation 0,1,2
所有的新建对象都是0代对象。
当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象
两个10的含义:每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收。
5. 孤立的引用环
引用环可能构成无法使用,但引用计数不为0的一些对象。遍历。。。。
相关文章推荐
- Python查找文件的大小删除此文件
- Python实现回文数字筛选
- Python write模式导致的bug
- PYTHON ASYNCIO: FUTURE, TASK AND THE EVENT LOOP
- 利用Python自动发送邮件
- 模块yaml
- 利用Python抓取图片
- Python&pip install中出现的asciii码错误的问题
- python05-09
- python全栈开发day1
- Python魔法 - MetaClass
- Python 手记
- Python numpy生成矩阵、串联矩阵
- Python numpy 平方、乘方和平方根函数
- Python运行报错IndentationError: unindent does not match any outer indentation level
- Python实现杨辉三角形
- Python tar.gz格式压缩、解压
- Python获取当前目录下所有文件的绝对路径并存储在文件中
- Python enumerate
- Python开发环境配置及工具库安装