day4-python基础-小数据池以及深浅copy浅讲

今天的目录是python

1.小数据池缓存

2.深浅copyapp

 

正文开始性能

1.小数据池优化

在说明今天的内容前,先说明一个在今天重复用到的一个知识点spa

###比较’=’俩边的数据是否彻底相同,以及判断一个对象的内存地址是否彻底相同###3d

#今天的内容深刻研究仍是很难再短期内讲清楚,今天只是浅浅的讲一下code

1.1#is判断等号俩边的数据是否相等对象

#id判断一个对象的内存地址是否彻底相同blog

name ='alex'
name1 ='alex1'
print(id(name))
print(id(name1))
print(name is name1)
#结果
2434239272024
2434240176512
False

能够明显的看到俩个name的值虽然相同,但是俩者在内存中的地址是彻底不一样的

1.2 python中的俩种优化机制

1.2.1 代码块

代码块:代码所有都是基于代码块去实现的(比如一个学校给一个班级下发命令),一个文件就是一个代码块,不一样的文件就是不一样的代码块

终端:对于终端,例如pc中的cmd执行python,一行就是一个代码块

代码块的缓存机制:

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

换一句话说:在执行同一个代码块的时候,遇到新的变量,会将初始化的这个变量与值存储在一个字典中,遇到新的变量,会先从字典中查询记录,若是有重复的值则重复利用

注意:机制只能在同一个代码块下才能实现,知足此机制的数据类型有:int str bool

优势:
1.节省内存

2.提高性能

1.2.2 小数据池

小数据池:又叫驻留机制,驻村机制,字符串的驻存机制,字符串的缓存机制等等,主要是用于不一样代码块的优化

适应的数据类型:str bool int

int:-5~256

str:必定条件下的str知足小数据池

bool值所有

优势:

1.节省内存

2.提高性能

 

总结:若是在同一个代码块中,用同一个代码块中的缓存机制,若是在不一样的代码块中,用小数据池

2.深浅copy

l1 =[1,2,3,4]
l2 = l1
l2.append(666)
print(l1,l2)
#结果
[1, 2, 3, 4, 666] [1, 2, 3, 4, 666]

2.1 浅copy

在内存中建立一个新的list(dict),可是新的列表中的元素仍是与原列表共用一个

l1 =[1,2,3,4]
l2 = l1
l2.append(666)
print(l1,l2)
l1 = [1, 'alex', [11,22]]
l2 = l1.copy()
print(id(l1),id(l2))
l1.append(33)
print(l1,l2)
print(id(l1[0]))
print(id(l2[0]))
print(id(l1[-1]))
print(id(l2[-1]))
print(l1 is l2)
l1[-1].append(666)
print(l1)
print(l2)

图示以下

M2]Y[@)M(AY`_Y_JZBPYM(J

2.2 深copy

深copy会在内存中对原列表(dict)以及列表里面的可变的数据类型从新建立一份,而列表中不可变的数据类型仍是沿用原来的。

import copy
l1 = [1, 'alex', [11,22]]
l2 = copy.deepcopy(l1)
# l1[0] = 1000
print(l1)
print(l2)
# print(id(l1))
print(id(l2))
print(id(l1[-1]))  # 2190627337480
print(id(l2[-1]))  # 2190627338888
print(id(l1[0]))
print(id(l2[0]))
l1[-1].append(666)
print(l1)
print(l2)

全切获得的列表是对原列表进行的浅copy

l1 = [1, 2, 3, [22,33]]
l2 = l1[:] # [::] #列表的全切
l1[-1].append(666)
print(l2)

图示以下

正常状况以下

8(3__Z)B_UX81%JN49UM{C8

在python内部机制优化后,对于int,str,元祖等不可变量继续沿用copy前的内存地址,对于列表字典等可变元素采用开辟新的空间

图示以下

`D4%K`Z{)]G({I25E7SO(%E