首先要明白对象和引用的概念 (例子:a=1, a为引用,1为对象,对象1的引用计数器为1,b=1此时内存中只有一个对象1,a,b都为引用,对象的引用计数器此时为2,因为有两个引用)

a=1,b=1

id(a)=id(b) #短的字符串,数字python在内存中是一个对象

a=[],b=[]

id(a)!=id(b) #字典,数组这样的对象在内存中python会new两个不同的对象

a="new a string"

b="new a string" #长的字符串python在内存中同样会new两个不同的对象

id(a)!=id(b)

引用计数器如何减少,当删除该对象的引用时候该对象的引用计数器将会减少。

a=[1,2]

b= [a,a] #a对象的引用计数为2

del b[0] #a对象的引用计数变为1

#字典同理

a=1

{"a":a,"b":a} #a对象的引用计数为2

del b[b] #a对象的引用计数变为1

python的垃圾回收(3种)

引用计数

当对象的引用的计数器变为0的时候,该对象可能在内存中,但是已经不能访问。python的垃圾回收时候不能做其他操作,如果一个对象的引用计数变为0的时候python就去回收该对象,那么很显然Python的效率会很差,那什么时候python会来回收呢?这是一个好问题。

python会监听自己new了多少个新的对象和有多少对象的引用计数器变为了,两个数值做差的到的数和阈值去比较,大于阈值,内存开始进行垃圾回收,销毁引用计数器为0的对象。

优点:简单实时性,缺点:维护引用计数消耗资源,循环引用。

分代回收

为了提高效率,有很多对象,清理了很多次他依然存在,可以认为,这样的对象不需要经常回收,可以把它分到不同的集合,每个集合回收的时间间隔不同。简单的说这就是python的分代回收。

具体说一下,python中的垃圾分为1,2,3代,在1代里的对象每次回收都会去清理,当清理后有引用的对象依然存在,此时他会进入2代集合,同理2代集合清理的时候存在的对象会进入2代集合。

每个集合的清理时间如何分配,会先清理1代垃圾,当清理10次一代垃圾后会清理一次2代垃圾,当清理10次2代垃圾后会清理2代垃圾。

标记清除

按需分配,当内存不够的时候,从寄存器和程序栈上的引用出发,遍历对象,将遍历的对象打上标记,然后在内存中清除没有标记的对象。

python竞赛内存_python的内存机制相关推荐

  1. python释放变量内存_Python变量内存管理

    一.变量存哪了? x = 10 当我们在p1.py中定义一个变量x = 10,那么计算机把这个变量值10存放在哪里呢了?我们回顾计算机的三大核心组件为:CPU.内存和硬盘.一定不是CPU,那是存放在内 ...

  2. python 垃圾回收器_Python 垃圾回收机制详细

    引用计数 Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然 ...

  3. python竞赛内存_Python的内存机制浅析

    Python的内存管理大概分为三点: 引用计数 垃圾回收 内存池机制 这是我要讲的东西嘛?Of course! 肯定不是啊,这些网上都有我要讲的是人家没有的才好玩啊. No. 1  内存 内存是计算机 ...

  4. python sqlite3写入内存_Python SQLite内存缓存

    我正在使用Python 2.7和SQLite.我正在建立一个有数百万行的数据库.我只想偶尔写入磁盘,这样可以提高性能.我的想法是只不时地调用commit().我用下面的代码试过了.中间的选择表明我们得 ...

  5. python线程执行完后释放内存_python变量内存地址释放与加速并行计算多线程

    1.导入numba和gc包进行并行计算和内存释放 代码如下很容易的: #coding:utf-8 import time from numba import jit, prange, vectoriz ...

  6. python 释放线程内存_python变量内存地址释放与加速并行计算多线程

    1.导入numba和gc包进行并行计算和内存释放 代码如下很容易的: #coding:utf-8 import time from numba import jit, prange, vectoriz ...

  7. python反射实例化_Python类反射机制使用实例解析

    这篇文章主要介绍了Python类反射机制使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 反射就是通过字符串的形式,导入模块:通过字符串的 ...

  8. python 相对导入_Python相对导入机制详解

    Google FEB 26TH, 2015 Python相对导入机制详解 这个答案能解释大多关于 relative import,即相对导入的疑惑,讲解十分详尽清晰,算是 SO 上被低估的一个答案. ...

  9. python hasattr函数_Python的反射机制、hasattr() getattr() setattr() 函数使用方法详解

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...

  10. python错误捕获例程_python 错误捕获机制分析

    python语言是编程中使用率在Top 3之内的语言.python语言以灵活与简单著称,那么越是灵活的语言越需要判断出错的功力. 简单示例 以下是一个简单的错误程序,被除数不可为0,那么看看该代码的执 ...

最新文章

  1. 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(一)
  2. 面试浅谈 c++ 的空间两级配置器
  3. Engagement Center Communication timer实现逻辑
  4. js方式调用php_js如何调用php函数
  5. java quartz2.1_quartz 2.1学习(一)
  6. 漫步线性代数十六——投影和最小二乘
  7. 调用微信支付接口总结
  8. 曾在阿里见证首个双11诞生,但今年作为枚青餐厅店主,我才真正成为了双11的主角...
  9. Mysql的两种存储引擎以及区别
  10. Linux嵌入式开发_修改机器码
  11. 两招轻松恢复误Ghost的硬盘
  12. 星岚技术 Win10 x64 装机版 V2021.5【带驱动包】
  13. 不等双11,立减¥3554!戴尔官网撩客服砍价带走高性能电脑,速来!
  14. table-首列冻结
  15. 大数据分析系统创新平台与生态建设
  16. 计算机编码器的工作原理,优先级编码器74LS148的电路结构、工作原理及使用方法...
  17. 台式电脑的计算机界面,台式机怎么进bios界面 台式电脑设置bios的方法
  18. Fluent Meshing的workflow方法
  19. 网络电话VOIP技术解析
  20. linux权限管理的设计,Linux权限管理漫谈之用户切换

热门文章

  1. 重写对象的equals和hashCode方法
  2. InfoQ编辑2018年推荐阅读清单(第二部分)
  3. Spark交互式工具spark-shell
  4. Python 面向对象一(转载)
  5. 如何用大数据开发套件周期调度机器学习算法
  6. 安装Linux操作系统(RHEL5.0)
  7. C#断点续传HTTP下载远程文件的方法
  8. directX9SDK中提取的9个DLL文件
  9. install4j Enterprise Edition序列号
  10. 拜托,面试别再问我TopK了!!!