Python中小数据池知识最详细教程

news2024/9/20 1:20:35

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

话不多说,直接开搞,如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码

一、id,is,==

在Python中,id是什么?

id是内存地址,比如你利用id()内置函数去查询一个数据的内存地址:

name = '张三'
print(id(name))  

那么 is 是什么? == 又是什么?

== 是比较的两边的数值是否相等,而 is 是比较的两边的内存地址是否相等。

如果内存地址相等,那么这两边其实是指向同一个内存地址。

可以说如果内存地址相同,那么值肯定相同,但是如果值相同,内存地址不一定相同。

二、代码块

根据官网提示我们可以获知:

根据提示我们从官方文档找到了这样的说法:
A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block.
A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block’s execution has completed.

上面的主要意思是:

Python程序是由代码块构造的。

块是一个python程序的文本,他是作为一个单元执行的。

代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。

而作为交互方式输入的每个命令都是一个代码块。

什么叫交互方式?

就是咱们在cmd中进入Python解释器里面,每一行代码都是一个代码块

例如:

而对于一个文件中的两个函数,也分别是两个不同的代码块:


OK,那么现在我们了解了代码块,但这和小数据池有什么关系呢?

且听下面分析。

代码块的缓存机制

Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。

换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。

所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同

代码块的缓存机制的适用范围: int(float),str,bool。

  • int(float) : 任何数字在同一代码块下都会复用。

  • bool : True和False在字典中会以1,0方式存在,并且复用。

  • str :几乎所有的字符串都会符合缓存机制,具体规定如下(了解即可!):

1.非乘法得到的字符串都满足代码块的缓存机制:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
s1 = '张三@!#*ewq'
s2 = '张三@!#*ewq'
print(s1 is s2)  # True

2.乘法得到的字符串分两种情况:

2.1 乘数为1时,任何字符串满足代码块的缓存机制:

b1 = '太白@5847395QQ0743895*&^%$#((&_+(())' *1
a1 = '太白@5847395QQ0743895*&^%$#((&_+(())' *1

print(a1 is b1)  # True

2.2 乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制:

s1 = 'old_' * 5
s2 = 'old_' * 5
print(s1 is s2)  # True

优点:

  1. 能够提高一些字符串,整数处理人物在时间和空间上的性能;

  2. 需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存。

三、小数据池

小数据池,也称为小整数缓存机制,或者称为驻留机制等等,博主认为,只要你在网上查到的这些名字其实说的都是一个意思,叫什么因人而异。

那么到底什么是小数据池?他有什么作用呢?

大前提:小数据池也是只针对 int(float),str,bool。

小数据池是针对不同代码块之间的缓存机制!!!

官方对于整数,字符串的小数据池是这么说的:

对于整数,Python官方文档中这么说:
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined.

对于字符串:
Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. –引自维基百科

经翻译可得,这个表达的意思就是:

Python自动将 -5~256 的整数 进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。

python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。

其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

优点:

  1. 能够提高一些字符串,整数处理人物在时间和空间上的性能;

  2. 需要值相同的字符串,整数的时候,直接从‘池’里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

int: 那么大家都知道对于整数来说,小数据池的范围是 -5~256 ,如果多个变量都是指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址。

那么对于字符串的规定呢?

str:字符串要从下面这几个大方向讨论(了解即可!):

1.字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。

2.字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。

3.用乘法得到的字符串,分两种情况。

3.1 乘数为1时:

仅含大小写字母,数字,下划线,默认驻留。


含其他字符,长度<=1,默认驻留。

含其他字符,长度>1,默认驻留。

3.2 乘数>=2时:

仅含大小写字母,数字,下划线,总长度<=20,默认驻留。

4,指定驻留。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from sys import intern
a = intern('hello!@'*20)
b = intern('hello!@'*20)
print(a is b)

指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。

满足以上字符串的规则时,就符合小数据池的概念。

bool值就是True,False,无论你创建多少个变量指向True,False,那么他在内存中只存在一个。

看一下用了小数据池(驻留机制)的效率有多高:

显而易见,节省大量内存在字符串比较时,非驻留比较效率o(n),驻留时比较效率o(1)。

四、总结。

如果在同一代码块下,则采用同一代码块下的换缓存机制。

如果是不同代码块,则采用小数据池的驻留机制。

# pycharm 通过运行文件的方式执行下列代码:  这是在同一个文件下也就是同一代码块下,采用同一代码块下的缓存机制。
i1 = 1000
i2 = 1000
print(i1 is i2)  # 结果为True 因为代码块下的缓存机制适用于所有数字

通过交互方式中执行下面代码: # 这是不同代码块下,则采用小数据池的驻留机制。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> i1 = 1000
>>> i2 = 1000
>>> print(i1 is i2)
False  # 不同代码块下的小数据池驻留机制 数字的范围只是-5~256.

更多验证:

# 虽然在同一个文件中,但是函数本身就是代码块,所以这是在两个不同的代码块下,不满足小数据池(驻存机制),则指向两个不同的地址。
def func():
    i1 = 1000
    print(id(i1))  

def func2():
    i1 = 1000
    print(id(i1))  

func()
func2()

尾语 💝

好了,今天的分享就差不多到这里了!

对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

最后,宣传一下呀~👇👇👇 更多源码、资料、素材、解答、交流 皆点击下方名片获取呀👇👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/948732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos升级python

升级为python3.10 yum updateyum install openssl-devel bzip2-devel libffi-develyum groupinstall "Development Tools"wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgztar -xzf Python-3.10.2.tgzcd Python-3.10.2./configure --enable-optimi…

JavaScript常见的运算符

一、运算符和运算元 1.认识运算符 在小学的时候我们就学习了各种运算符&#xff0c;比如加号 、乘号 *、减号 - 、除号/ 几乎所有的编程语言都有各种各样的运算符(也被称之为操作符&#xff0c;operators) 初次接触这些运算符, 你会感觉种类繁多, 难以记忆.但是并不需要特别…

Lora升级!ReLoRa!最新论文 High-Rank Training Through Low-Rank Updates

目录 摘要1 引言2 相关工作3 方法4 实验5 结果6 结论7 局限性和未来工作 关注公众号TechLead&#xff0c;分享AI与云服务技术的全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0…

使用文本编辑器sublime text编写python代码

前言 上篇文章介绍了如何安装python程序&#xff0c;这次就讲讲如何用sublime来编写python代码 有的小伙伴可能会有疑问&#xff0c;为什么不选择pycharm来编写&#xff1f; pycharm写代码会有代码补全功能&#xff0c;而我们新手正是要在犯错误的过程中积累经验&#xff0c…

论文解读 | 新发现编码器PointPillars用于点云检测物体,更加高效且精准

原创 | 文 BFT机器人 01 技术背景 在过去的几年中&#xff0c;深度学习技术已经在图像领域的物体检测中取得了显著的进展&#xff0c;诸如目标检测算法&#xff08;如Faster R-CNN、YOLO和SSD&#xff09;在图像中能够高效准确地检测出物体。然而&#xff0c;当涉及到点云数据…

get√接口自动化核心知识点浓缩,为面试加分

日常接触到的接口自动化从实际目标可以划分为两大类&#xff1a; 1、为模拟测试数据而开展的接口自动化 这种接口自动化大多是单次执行&#xff0c;目的很明确是为了功能测试创造测试数据&#xff0c;节约人工造数据的时间和人工成本&#xff0c;提高功能测试人员的测试效率。…

《论文阅读18》JoKDNet

一、论文 研究领域&#xff1a;用于大尺度室外TLS点云配准的联合关键点检测和特征表达网络论文&#xff1a;JoKDNet: A joint keypoint detection and description network for large-scale outdoor TLS point clouds registration International Journal of Applied Earth Ob…

Java定时任务调用执行shell脚本实例

文章目录 Java代码1234 shell脚本 Java代码 1 2 3 4 shell脚本

检查nacos是否正常启动

可以通过以下几种方式检查nacos是否启动&#xff1a; 查看nacos日志文件&#xff1a;启动nacos时&#xff0c;控制台会输出一些信息&#xff0c;可以查看控制台输出的信息&#xff0c;如果显示“Server startup in XXX ms”等字样&#xff0c;则说明nacos已经启动。 查看端口…

【C++深入浅出】初识C++下篇(auto关键字、范围for、nullptr指针)

目录 一. 前言 二. auto关键字 2.1 auto的引入 2.2 auto简介 2.3 auto的使用细则 2.4 auto不能推导的场景 三. 基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的原理 3.3 范围for的使用条件 四. 指针空值nullptr(C11) 一. 前言 上期我们介绍了c新增的两个重…

ERROR o.s.b.SpringApplication - Application run failed

报错&#xff1a; Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2023-08-25 18:32:41,704 main ERROR o.s.b.SpringApplication - Application run failed org.springframework.beans.factory.BeanCre…

路由器的简单概述(详细理解+实例精讲)

系列文章目录 华为数通学习&#xff08;4&#xff09; 目录 系列文章目录 华为数通学习&#xff08;4&#xff09; 前言 一&#xff0c;网段间通信 二&#xff0c;路由器的基本特点 三&#xff0c;路由信息介绍 四&#xff0c;路由表 五&#xff0c;路由表的来源有哪些…

tsmc standard cell命名规则

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 CKMUX2代表二输入clock mux&#xff0c;D2代表驱动强度X2&#xff0c;6T代表row高为6track&#xff0c;16P96C代表gate length和poly pitch&#xff0c;LVT就是low voltage thr…

鲜花小程序制作教程:让你的花店与时俱进

在当今的电子商务时代&#xff0c;消费者对于购物体验的要求越来越高。对于鲜花这一类商品&#xff0c;消费者更是希望能够方便快捷地购买到高品质的花卉&#xff0c;并且能够享受到一流的购物体验。为了满足消费者的需求&#xff0c;许多商家选择利用小程序来打造一流的鲜花购…

ssm化妆品配方及工艺管理系统源码和论文

ssm化妆品配方及工艺管理系统源码和论文083 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 课题的目的和意义 进入21世纪后我国的经济增长在全球脱颖而出&#xff0c;人们的生活质量也在不断地提高&#xff0…

【Java多线程学习7】JMM(Java内存模型)学习

JMM&#xff08;Java内存模型&#xff09;学习 一、什么是Java内存模型&#xff1f; 为什么需要JMM&#xff1f; JMM&#xff08;Java内存模型&#xff09;&#xff0c;可以看作是Java定义的并发编程相关的一组规范&#xff0c;除了抽象了线程和主内存之间的关系之外&#xf…

Vulnhub系列靶机---JIS-CTF-VulnUpload-CTF01靶机

文章目录 1、网卡配置2、信息收集主机发现端口扫描目录扫描 3、漏洞探测4、漏洞利用一句话木马蚁剑 GetShellSSH连接提权 JIS文档说明 JIS-CTF-VulnUpload-CTF01靶机下载地址 该靶机有5个flag 1、网卡配置 开启靶机&#xff0c;看见加载的进度条按shift&#xff0c;看到如下界…

科普宣传片的投放渠道

科普宣传片通常以教育性和娱乐性为主导&#xff0c;力求在观众中引起兴趣和好奇心&#xff0c;以吸引他们主动学习和探索科学。它可以在电视台、网络平台、科普展览、学校教育等场合播放&#xff0c;对各个年龄段的观众都有普及科学知识的作用。接下来由深圳科普宣传片制作公司…

LeetCode——回溯篇(三)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 46. 全排列 47. 全排列 II 332. 重新安排行程 51. N 皇后 37. 解数独 46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任…

uni-app实现点击显示隐藏列表,兼容微信小程序

效果&#xff1a; <view class"list-item" v-for"(item,index1) in listData" :key"index1"><view class"item-title" click"item.content.length>0?handleToggle(item,index1):"><view class"&qu…