python之小数据池
代码块
Python 程序 是由代码块构造的。块是一个python程序的文本,它是作为一个执行单元的。
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。
而作为交互方式输入的每个命令都是一个代码块。
什么叫交互方式呢?就是咱们在cmd中进入python解释器里同,每一行代码就是一个代码块。

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

代码块的缓存机制
Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。
代码块的缓存机制的适用范围: int(float),str,bool。
int(float):任何数字在同一代码块下都会复用。
bool:True和False在字典中会以1,0方式存在,并且复用。
优点:能够提高一些字符串,整数处理人物在时间和空间上的性能;
需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存。
小数据池
小数据池,也称为小整数缓存机制,或者称为驻留机制等
大前提:小数据池也是只针对 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. 对于字符串:
Incompute science, string interning is method of storing only onecopy of each distinct string value,which must be immutable.
Interning string 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 in a string intern pool. --引自维基百科
上面的意思就是:
Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。
优点:能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘池’里拿来用,避免频繁的创建和销毁,提升效率,节约内存。
缺点:在‘池’中创建或插入字符串,整数时,会花费更多的时间
补充:小数据池,可以理解为ORACLE数据库中的SGA,即共享全局区,所以python进程共享的。
int: 对于整数来说,当整数范围在 -5 ~ 256 这个闭区间时,会放进小数据池,此时多个变量同时指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址。
那么对于字符串的规定呢?
str:字符串要从下面这几个大方向讨论:
1. 字符串的长度为0或1时,默认都采用驻留机制(小数据池)
>>> s1 = '$'
>>> s2 = '$'
>>> print(id(s1),id(s2))
2647489083856
>>> print(s1 is s2 )
True
>>>
2. 字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
>>> s1 ='chris_is_a_old_boy_driver'
>>> s2 = 'chris_is_a_old_boy_driver'
>>> print(s1 is s2)
True
>>>
3. 用乘法得到的字符串,分两种情况:
3.1 乘数为1时:
仅含大小写字母,数字,下划线,默认驻留。

>>>
>>> a = 'abcedfgjihiklsodopqrstuvwxyz_8989'
>>> b = a * 1
>>> print(a is b)
True
>>>

含其他字符,长度>1, 默认驻留。
>>> a = 'abcedfgjihiklsodopqrstuvwxyz_8989##'
>>> b = a * 1
>>> print(a is b)
True
>>>
3.2 乘数 >= 2 时:
仅含大小写字母、数字、下划线,总长度<=20,默认驻留。
>>> a = 'abcedfgjihiklsodopqrstuvwxyz_8989'
>>> b = a * 2
>>> c = a * 2
>>> print(b is c )
False
4. 指定驻留

>>> from sys import intern
>>> a = intern('hello!@' * 20 )
>>> b = intern('hello!@' * 20 )
>>> print(a is b)
True
>>>

满足以上字符串的规则时,就符合小数据的概念。
bool值 就是True,False,无论你创建多少个变量指向True,False,那么他在内存中只存在一个。
看一下用了小数据池(驻留机制)的效率有多高:
显而易见,节省大量内存在字符串比较时,非驻留比较效率o(n),驻留时比较效率o(1)。
参考网址:https://www.cnblogs.com/jin-xin/articles/9439483.html
python之小数据池的更多相关文章
- 6.Python初窥门径(小数据池,集合,深浅拷贝)
Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...
- python的小数据池
一.什么是小数据池? 小数据池是一种缓存机制,也被称为驻留机制.各种编程语言中都有类似的东西(常量池.小数据池都是指得同一个内容). python自动将-5~256的整数.有一定规则的字符串.都放在一 ...
- python基础--小数据池,代码块的最详细、深入剖析
本文转至太白金星 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存 ...
- python --- 06 小数据池 编码
一.小数据池, id() 进行缓存 1.小数据池针对的是: int, str, bool 2.在py文件中几乎所有的字符串都会缓存. 在cmd命令窗口中几乎都不会缓存 不同的解释器有不同 ...
- python的小数据池 is和== 以及再谈编码
---恢复内容开始--- 1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 # a = 10 # b ...
- python的小数据池和深浅拷贝
小数据池 一种数据缓存机制,也称驻留机制 在同一代码块,相同的值不会开辟新的内存 特殊字符除外 小数据池只针对:在控制台时! 数字 :-5到256间的整数会被缓存 布尔值:都会缓存8 字符串 小于等于 ...
- 小数据池 is和== 再谈编码
昨日回顾 上节课内容回顾 1. 字典 {key:value, key:value.....} 成对的保存数据 字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的 1. 增加: dic[新 ...
- Python二次编码、小数据池之心照神交
二次编码.解码.小数据池: encode(str:编码):参数编码方式,返回字节码. str_1 = "编码" str_2 = str_1.encode("utf-8&q ...
- python基础之小数据池、代码块、编码和字节之间换算
一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽 ...
随机推荐
- java 线程(五)线程安全 Lock接口
package cn.sasa.demo3; import java.util.concurrent.ExecutionException; public class ThreadDemo { pub ...
- collection my favoriate websites
802.1x认证客户端linux版安装 http://blog.csdn.net/StarChunli/article/details/50918121 在U盘上安装kali linux http:/ ...
- es调用脚本
1.内部脚本("script" : "ctx._source" 是内部定义好的获取_source数据的方式,不用改变)POST /index/type/id/_ ...
- c语言指针应用
指针变量指向数组元素: #import <stdio.h> int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; int *p; p=a; for ( ...
- webmin小结
centos7安装webmin https://www.cnblogs.com/andy9468/p/10537201.html webmin重置密码 重置webmin账户root的密码为例: htt ...
- MySQL分支Percona
MySQL分支Percona 转载自:http://www.cnblogs.com/cevin/archive/2012/05/12/2496859.html 官方网站:http://www.perc ...
- Mysql索引基础原理
索引的概念 索引是特殊数据结构: 定义在查找时作为查找条件的字段 索引实现在存储引擎 功能: 1.约束数据 2.加速查询 优点: 索引可以降低服务需要扫描的数据量,减少了IO次数 索引可以帮助服务器 ...
- NYOJ 食物链(WA)
1.WA代码 思路:预先分好3类,对每一行数据进行分类和真话假话判断 WA原因:前面某些行的数据 需要依赖 后面某些行给的数据 才能进行分类 初步改正思路( 对于前面给的无法直接分类的数据进行记录,等 ...
- ABP中针对sql2008的数据库配置
- Linux下Nginx安装
前提: 1.需要gcc环境:yum install gcc-c++ 2.需要第三方开发包: PCRE.zlib.openssl yum install -y pcre pcre-devel yum i ...