Python内存管理实例分析

yipeiwu_com6年前Python基础

本文实例讲述了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')

千万不要两个对象相互引用或自己引用自己,形成引用环给垃圾回收机制带来麻烦。

垃圾回收

回收引用计数为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代。

孤立的引用环

原本两表对象相互引用后删除引用,但对象引用计数部位0不会被回收。

则python复制每个对象引用计数,对某个对象i,遍历所有对象i引用的对象j,将gc_ref_j减1.

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总

希望本文所述对大家Python程序设计有所帮助。

相关文章

Python三元运算实现方法

本文实例讲述了Python三元运算实现方法。分享给大家供大家参考。具体分析如下: Python中没有像C++和Java等语言中的三元运算符,但是可以用if else语句实现相同的功能:...

python不带重复的全排列代码

复制代码 代码如下:from sys import argvscript, start, end = argvvis = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...

使用apiDoc实现python接口文档编写

apiDoc的安装 npm install apidoc -g 点击官方文档 生成api的终端命令:apidoc -i 代码所在路径-o 生成文件的路径 接口文档的编写 文件的简介...

Python3搜索及替换文件中文本的方法

本文实例讲述了Python3搜索及替换文件中文本的方法。分享给大家供大家参考。具体实现方法如下: # 将文件中的某个字符串改变成另一个 # 下面代码实现从一个特定文件或标准输入读取...

Python函数返回值实例分析

本文实例讲述了Python的函数返回值用法。分享给大家供大家参考。具体分析如下: 最近学一些Python的基本用法,看到定义函数,发现似乎只能返回一个返回值,想想matlab里返回多个返...