编码与小数据池

# 字符编码计算机底层储存的都是二进制码
# 而我们将这些二进制码进行规律排列就诞生了字符编码
# 最初的编码是ACCII编码,他是采用了八位二进制码,主要包含了英文数字和一些特殊字符
# 八位二进制码最多只能包含256种变化
# 中国所使用的是GBK国标编码采用16位二进制码,而我们将八位二进制码称为一个字节
# 为了统一标准后续推出了万国码unicode编码
# unicode编码可以表示上亿字符,对于内存硬盘是一种很大的浪费,所以就有了现在的UTF-8,UTF-16压缩的unicode编码
# UTF-8中如果是英文数字,则使用ACCII编码,占用一个字节,如果是汉字则是三个字节
# 00000000 00000000 00000000 10101010 假设这个表示内存中的10,那么前三个字节就属于浪费空间,而在UTF-8编码中就去除了这些填补的字节

# 提及编码我们就涉及到内存的问题,在python3中默认使用的是unicode编码
# 在python中有两个优化机制,一个是代码块的缓存机制,一个是小数据池机制

# 前提条件:在同一个代码块内。
# 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。
# 换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,
# 如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,
# 满足缓存机制则他们在内存中只存在一个,即:id相同。

# 适用对象: int(float),str,bool。
# 对象的具体细则:(了解)
#   int(float):任何数字在同一代码块下都会复用。
#   bool:True和False在字典中会以1,0方式存在,并且复用。
#   str:几乎所有的字符串都会符合缓存机制,具体规定如下

s1 = '天空!@#wer&*'
s2 = '天空!@#wer&*'
print(s1 is s2)
# 打印为True,前提是在同一个代码块下,如果非同一代码块则为False


# 小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等,博主认为,只要你在网上查到的这些名字其实说的都是一个意思,叫什么因人而异。
# 那么到底什么是小数据池?他有什么作用呢?
# 前提条件:在不同一个代码块内。
# Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
# python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
#   其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序
# 中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

# 适用对象: int(float),str,bool
# int:那么大家都知道对于整数来说,小数据池的范围是-5~256 ,如果多个变量都是指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址。
# 字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。
# 字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
# 用乘法得到的字符串,分两种情况。
# 仅含大小写字母,数字,下划线,默认驻留,且乘数为一,默认驻留
# 仅含大小写字母,数字,下划线,总长度<=20,默认驻留

# 指定驻留。
from sys import intern
a = intern('hello!@'*20)
b = intern('hello!@'*20)
print(a is b)

 

posted on 2019-10-18 09:53  素心~  阅读(122)  评论(0编辑  收藏  举报

导航