python数据容器操作教程(Python3中的小数据池缓存机制)
python数据容器操作教程(Python3中的小数据池缓存机制)命令行中:Python 3.6.7 (v3.6.7:6ec5cf24b7 Oct 20 2018 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32 Type "help" "copyright" "credits" or "license()" for more information. >>> i1=-6 >>> i2=-6 >>> id(i1) id(i2) (1497808937200 1497808937168) # -6 内存地址不同 >>> i1=-5 >>> i2=-5 >>> id(i1) id(i2) (1621191232 162119123
Python中变量是对象的引用(类似于c语言中的void指针),在把对象赋值给变量的时候首先会创建对象,创建变量,然后把变量指向对象,也就是说每次赋值都会创建一个新的对象(不像c语言中直接给内存赋值)。如果每次赋值都创建新的对象的话,内存就会极大的浪费,性能速度也极其的低下,所以就对Python进行了优化,引入了缓存机制,就是把一些小的数值类型数据,字符串数据等等在首次使用之后缓存起来,如果下次再次用到就直接从缓存中拿,这样就极大了提高Python的速度。这就是Python中所谓的小数据池。
1:id() is == 分别是什么? 为了方便下面的测试,需要引入 id() is == 这三个工具,其解释如下:
id(x) : id查看的是对象的地址是多少(要注意的是,它不是查看变量x的地址,而是查看变量x指向的对象的地址(类似于c语言中指针指向的内存的地址))
x1 is x2 :查看的是变量x1指向的对象的地址 与 变量x2指向的对象的地址是否相同;
x1 == x2:查看的是变量x1指向的对象的值 与 变量x2指向的对象的值是否相同;
所有的操作与变量没有半毛钱关系,只与变量指向的对象有关系。
多小的数据才缓存呢?
2.1整数a:不同代码块(包括表达式计算出来的,直接赋值的):-5 到 256
命令行中:
Python 3.6.7 (v3.6.7:6ec5cf24b7 Oct 20 2018 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32
Type "help" "copyright" "credits" or "license()" for more information.
>>> i1=-6
>>> i2=-6
>>> id(i1) id(i2)
(1497808937200 1497808937168) # -6 内存地址不同
>>> i1=-5
>>> i2=-5
>>> id(i1) id(i2)
(1621191232 1621191232)
>>> i1=256
>>> i2=256
>>> id(i1) id(i2)
(1621199584 1621199584) #256 内存地址相同
>>> i1=257
>>> i2=257
>>> id(i1) id(i2)
(1497808937168 1497808937200) #257 内存地址不同
>>>
b:相同代码块:
通过表达式计算出来的:-5 到 256;
直接赋值:-5 到 无上限;
print('*'*60)
# 表达式计算
i1 = -4 - 1
i2 = -4 - 1
i3 = -4 - 2
i4 = -4 - 2
print('1---id(i1)--' id(i1) i1)
print('1---id(i2)--' id(i2) i2)
print('1---id(i3)--' id(i3) i3)
print('1---id(i4)--' id(i4) i4)
"""
# 结果:-5 的内存地址是一样的;计算出来的-6是不一样的
1---id(i1)-- 1621191232 -5
1---id(i2)-- 1621191232 -5 # -5 的内存地址是相同的
1---id(i3)-- 1221555543696 -6
1---id(i4)-- 1221555543728 -6 # -6 的内存地址是相同的
"""
print('*'*60)
i1 = 255 1
i2 = 255 1
i3 = 256 1
i4 = 256 1
print('2---id(i1)--' id(i1) i1)
print('2---id(i2)--' id(i2) i2)
print('2---id(i3)--' id(i3) i3)
print('2---id(i4)--' id(i4) i4)
"""
# 结果 256 的内存地址是一样的;计算出来的257是不一样的;
2---id(i1)-- 1621199584 256
2---id(i2)-- 1621199584 256 # 256内存地址相同
2---id(i3)-- 1617788231504 257
2---id(i4)-- 1617788231536 257 # 257内存地址不同
"""
print('*'*60)
# 直接赋值
i1 = -5
i2 = -5
i3 = -6
i4 = -6
print('3---id(i1)--' id(i1) i1)
print('3---id(i2)--' id(i2) i2)
print('3---id(i3)--' id(i3) i3)
print('3---id(i4)--' id(i4) i4)
"""
# 结果:-5 的内存地址是一样的;-6是不一样的
3---id(i1)-- 1621191232 -5
3---id(i2)-- 1621191232 -5 # -5地址相同
3---id(i3)-- 2727216439184 -6
3---id(i4)-- 2727216439216 -6 # -6地址相同
"""
print('*'*60)
# 直接赋值
i1 = 256
i2 = 256
i3 = 257
i4 = 257
#
i5 = 99999999999999999999999999999999999999999999999999999999999999
i6 = 99999999999999999999999999999999999999999999999999999999999999
print('4---id(i1)--' id(i1) i1)
print('4---id(i2)--' id(i2) i2)
print('4---id(i3)--' id(i3) i3)
print('4---id(i4)--' id(i4) i4)
print('4---id(i5)--' id(i5) i5)
print('4---id(i6)--' id(i6) i6)
"""
# 结果 256 的内存地址是一样的;计算出来的257是不一样的;
4---id(i1)-- 1621199584 256
4---id(i2)-- 1621199584 256 # 256内存地址相同
4---id(i3)-- 2727214952176 257
4---id(i4)-- 2727214952176 257 # 256内存地址相同
4---id(i5)-- 2727217171792 99999999999999999999999999999999999999999999999999999999999999
4---id(i6)-- 2727217171792 99999999999999999999999999999999999999999999999999999999999999 # 这么大的数据 内存地址也是相同的
"""
2.2:字符串
print('*'*60)
# 1: 直接赋值的:地址会相同
s1 = 'ixusy88ixusy88ixusy88ixusy88dsafasdfkjkqiwodo;md;lvm;lk;HIJIADKF;KAFKDPEWKFLAKF;DAKFAKLDF;FLK'
s2 = 'ixusy88ixusy88ixusy88ixusy88dsafasdfkjkqiwodo;md;lvm;lk;HIJIADKF;KAFKDPEWKFLAKF;DAKFAKLDF;FLK'
print('直接赋值的:地址会相同')
print('1---len(s1)=' len(s1) id(s1) id(s2))
# 2:使用 连接的:也会相同
s1 = 'ixusy88' 'ixueeesy88' 'ixufffsy88' '545455f5d54sdf5sfsd54f4a45adsf45dasf5asd5fsd45fdsa54f5asd4fe45af5dsfa5s'
s2 = 'ixusy88' 'ixueeesy88' 'ixufffsy88' '545455f5d54sdf5sfsd54f4a45adsf45dasf5asd5fsd45fdsa54f5asd4fe45af5dsfa5s'
print('使用 连接的:也会相同')
print('1---len(s1)=' len(s1) id(s1) id(s2))
print('*'*60)
# 3:使用 * 重复:'sss' * N
# 重复次数 为1的:会缓存
# 重复次数 大于1的:结果长度大于20的不会缓存;<=20的会缓存
# 重复次数大于1:
s1 = 'a' * 20
s2 = 'a' * 20
print('使用 * 重复 重复次数大于1')
print('1---len(s1)=' len(s1) id(s1) id(s2))
s1 = 'a' * 21
s2 = 'a' * 21
print('2---len(s1)=' len(s1) id(s1) id(s2))
s1 = 'ab' * 10
s2 = 'ab' * 10
print('3---len(s1)=' len(s1) id(s1) id(s2))
s1 = 'ab' * 11
s2 = 'ab' * 11
print('4---len(s1)=' len(s1) id(s1) id(s2))
s1 = 'asdfghjklqq' * 2
s2 = 'asdfghjklqq' * 2
print('5---len(s1)=' len(s1) id(s1) id(s2))
# 重复次数为1的:
print('使用 * 重复 重复次数为1的:')
s1 = 'asdfghjklqqlo098hyhj' * 1
s2 = 'asdfghjklqqlo098hyhj' * 1
print('6---len(s1)=' len(s1) id(s1) id(s2))
s1 = 'asdfghjklqqlo098hyhej' * 1
s2 = 'asdfghjklqqlo098hyhej' * 1
print('7---len(s1)=' len(s1) id(s1) id(s2))
s1 = 'asdfghjklqqlo09dsfknskfnskndslfnsllnoa97097380237djfbskj8hyhej' * 1
s2 = 'asdfghjklqqlo09dsfknskfnskndslfnsllnoa97097380237djfbskj8hyhej' * 1
print('7---len(s1)=' len(s1) id(s1) id(s2))
"""
************************************************************
直接赋值的:地址会相同
1---len(s1)= 93 2711346825376 2711346825376
使用 连接的:也会相同
1---len(s1)= 98 2711346989184 2711346989184
************************************************************
使用 * 重复 重复次数大于1
1---len(s1)= 20 2711347713344 2711347713344
2---len(s1)= 21 2711347713416 2711347713272
3---len(s1)= 20 2711347713488 2711347713488
4---len(s1)= 22 2711347713272 2711347713416
5---len(s1)= 22 2711347713560 2711347713272
使用 * 重复 重复次数为1的:
6---len(s1)= 20 2711347712336 2711347712336
7---len(s1)= 21 2711347712480 2711347712480
7---len(s1)= 62 2711347663680 2711347663680
"""