首页 > 编程语言 >Python缓存机制

Python缓存机制

时间:2023-02-13 14:34:09浏览次数:40  
标签:缓存 Python list free 元组 机制 内存地址

1. 什么是缓存机制

  Python对象在创建的时候,会为其开辟一个内存,当变量引用该对象时,实际上是指向该对象的内存地址,当该对象不在被引用,会被垃圾回收机制回收,释放内存。但是Python为了解决对象创建—开辟内存,对象回收—释放内存这么一个对内存反复操作导致时间的浪费,就有了缓存池这一概念来管理一些常见的对象,当对象的引用计数为0时,他从refchain链表中删除,并不是直接销毁,而是放到了一个free_list的链表中进行缓存,当出现一个类型相同的对象时,直接用他的上一个对象的内存地址,只需在refchain中对其值进行初始化即可。

 

2. 缓存池机制

  Python在启动时,会创建一部分对象并将他们放置缓存池中,当引用这些对象时,不会重新创建,而是直接引用缓存,如整型[ -5 —256 ],布尔类型,字符串类型

  1. 整型

    

   2. 布尔类型

   

  3. 字符串

   

 

3. 驻留机制

  1. python的驻留机制是python系统内部维护了一个叫 “interned” 的字典,当允许被驻留的数据首次创建时,会被记录到该字典中,如果在 “同一个代码块中(代码块可以是一个模块,一个函数,一个类,一个文件)” 该数据被删除或者被其他对象再次引用时,不开辟新的内存空间,而是直接指向驻留空间中的内存地址,这样可以大量的节省内存空间。不同版本的驻留机制可能不太相同,以3.7版本为例:整型、浮点型、布尔型,字符型都满足驻留机制。

  举个例子:

   当a = 11111,b 也引用11111这个对象,则b的地址直接执行11111的内存地址,不在重新创建新的内存地址

 

  元组,列表,集合,字典他们不符合驻留机制,即使他们的元素内容相同,所执行的内存地址也是不相同的,但是空元组的内存地址却是相同的。

  元组:

  

  列表:

  

 

4. free_list机制

  free_list机制是对特定的数据类型的缓存而进行的存储链表,如[-5 — 256 ]外的整型、大于0的浮点型、以及列表,集合,元组和字典,当我们引用计数器为0时,应该启用垃圾回收机制回收该内存空间,但实际上python并没有直接回收,“在不同的代码块中(注意)” 而是将对象添加到一个叫 “free_list” 的列表中作为缓存,这个机制就叫做 “free_list机制”。这是做什么呢?这就是为了在以后再创建对象时,不再重新开辟内存,而是使用 free_list 中的内存空间。

  举个例子

   s1 = 333  (id(s1),内存地址是2253215090224)

   del s1   删除s1,则333这个对象的引用技术为0,从refchain链表中删除,将这个类型的内存地址放在了free_list中

   s2 = 666  (id(s2),内存地址为2253215090224),指向了在free_list中缓存的地址,只是将内存地址初始化重新赋值放到refchain链表中

    

   但是,对于小于0的浮点数,则不会进入free_list中缓存,而是直接进行回收,创建的时候在开辟内存

   

 

 

   

  1. 元组的缓存机制

    元组的缓存利用下标进行,最大索引是20,即元组的元素最大不超过20个,每个索引的链表存储这相同元素数量的对象,每个链表最多存储2000个对象,也就是说(1,2,3,4)和('a','b',1,2)是在相同的索引链表中存储,当一个元组对象被删除或者创建时,他会去和元组中元素个数相同的索引下去寻找是否存在空闲的地址,存在则引用该地址重新赋值即可。

  

 

   代码结果:

  

 

 

  2. 列表的缓存机制

   列表和元组的free_list机制不同,列表的缓存数量最多为80个,超出则进行回收

   

 

    

  3. 字典的缓存机制

    字典的机制和列表是一样的,最多为80个

    

  

标签:缓存,Python,list,free,元组,机制,内存地址
From: https://www.cnblogs.com/chf333/p/17115890.html

相关文章

  • python datetime 时间模块
    datetime.now()会得到当前时间,datetime.datetime(2023,2,13,17,24,29,309381currentDateAndTime=datetime.now()print(f'Time:{currentDateAndTime.year}/{cur......
  • python中的模块调用案例
    此案例是本人在B站上学习“黑马程序员”up主的课,课程中一个案例特别好,在此记录一下。在创建包的时候,会产生一个__init__.py文件,如果没有这个文件,那么就是生成的普通文件夹。......
  • python自动化办公--pyautogui控制鼠标和键盘操作
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。 ......
  • python基础之字符串处理
     ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。 ......
  • Python常见面试题(持续更新 23-2-13)
    Python常见面试题(持续更新23-2-13)参考资料https://github.com/taizilongxu/interview_pythonhttps://github.com/hantmac/Python-Interview-Customs-Collectionhtt......
  • Macbook macOS安装Python虚拟开发环境virtualenv
    由于各种工具包版本兼容性问题,pip安装到虚拟环境比较方便管理版本、依赖、更新、测试等。打开终端,安装pipinstallvirtualenv或者apt-getinstallvirtualenv查看版......
  • 多变量两两相互关系联合分布图的Python绘制
      本文介绍基于Python中seaborn模块,实现联合分布图绘制的方法。  联合分布(JointDistribution)图是一种查看两个或两个以上变量之间两两相互关系的可视化图,在数据分析......
  • 【转发】Python正则表达式,感谢大佬
    原文:https://www.cnblogs.com/QYGQH/p/12653871.html#!comments python正则表达式的实现主要是通过python的re库,re库是python的标准库,所以无须安装1.正则表达式的常用......
  • Python中 字符串的title()方法 首字母大写
    字符串的title方法:1、将字符串中所有单词的首个字母转化为大写,其他字母均转化为小写,特别注意:若在字符串中遇到标点符号、空格、数字等其他非字母元素,则非字母元素后的......
  • python练习记录 2.13
    开始函数部分的学习练习1定义一个函数,此函数能打印一个矩形,自定义函数列数和填充字符 ......