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

相關文章
相關標籤/搜索