08 python 要点 (内存管理)

第四章 内存管理

1、对象池

小整数池

  • 系统默认创建好的,等着你使用
  • 概述 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是 [-5, 256],这些整数对象是提前建立好的,不会被垃圾回收在一个 Python 的程序中,无论这个整数处于LEGB(局部变量,闭包,全局,内建模块)中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象。
  • 大整数池 默认创建出来,池内为空的,创建一个就会往池中存储一个。

intern机制

  • 每个单词(字符串),不夹杂空格或者其他符号,默认开启intern机制,共享内存,靠引用计数决定是否销毁
  • python中对大于256的整数,会重新分配对象空间地址保存对象;对于字符串来说,如果不包含空格的字符串,则不会重新分配对象空间,对于包含空格的字符串则会重新分配
a = 100
print(id(a))  # 140716414149488
del a
b = 100
print(id(b))  # 140716414149488
# 发现删除a后,b的地址依旧是删除之前的那个地址(是否删除,小整数都常驻内存)

2、垃圾收集

python里也同java一样采用了垃圾收集机制,不过不一样的是:python采用的是引用计数机制为主,隔代回收机制为辅的策略。

1、引用计数增加

  • a、对象被创建
  • b、另外变量也指向当前对象
  • c、作为容器对象的一个元素
  • d、作为参数提供给函数:test(x)

2、引用计数减少

  • a、变量被显式的销毁
  • b、对象的另外一个变量重新赋值
  • c、从容器中移除
  • d、函数被执行完毕

当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。比如某个新建对象,被分配给某个引用,对象的引用计数变为1。如 为0,那么该对象就可以被垃圾回收

3、隔代回收

隔代回收是用来解决交叉引用(循环引用), 并增加数据回收的效率. 原理:通过对象存在的时间不同,采用不同的算法来回收垃圾. 形象的比喻,三个链表,零代链表上的对象(新创建的对象都加入到零代链表),引用数都是一,每增加一个指针,引用加一,随后python会检测列表中的互相引用的对象,根据规则减掉其引用计数.GC算法对链表一的引用减一,引用为0的,清除,不为0的到链表二,链表二也执行GC算法,链表三一样. 存在时间越长的数据,越是有用的数据

不同的时间间隔处理这些对象,Python处理零代最为频繁,其次是一代然后才是二代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值