今天的目錄是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)
圖示以下
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)
圖示以下
正常狀況以下
在python內部機制優化後,對於int,str,元祖等不可變量繼續沿用copy前的內存地址,對於列表字典等可變元素採用開闢新的空間
圖示以下