欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python小數(shù)據(jù)池和代碼塊緩存機制

 更新時間:2021年04月07日 14:32:45   作者:海天之涯  
這篇文章主要介紹了詳解Python 小數(shù)據(jù)池和代碼塊緩存機制的相關(guān)資料,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下

前言

本文除"總結(jié)"外,其余均為認識過程;3.7.5;這部分官方文檔不知道在哪里找,目前沒有找到,有誰知道的可以麻煩留言嗎? 謝謝了!

總結(jié):

如果在同一代碼塊下,則采用同一代碼塊下的緩存機制;
如果是不同代碼塊,則采用小數(shù)據(jù)池的駐留機制;
需要注意的是,交互式輸入時,每個命令都是一個代碼塊;

實現(xiàn) Intern 保留機制的方式非常簡單,就是通過維護一個字符串儲蓄池,這個池子是一個字典結(jié)構(gòu),編譯時,如果字符串已經(jīng)存在于池子中就不再去創(chuàng)建新的字符串,直接返回之前創(chuàng)建好的字符串對象,
如果之前還沒有加入到該池子中,則先構(gòu)造一個字符串對象,并把這個對象加入到池子中去,方便下一次獲??;

長度為0與1的字符串一定會被駐留;
字符串駐留發(fā)生在程序編譯時;
被駐留的字符串必須由 ASCll 字母, 數(shù)字以及下劃線組成;

1.代碼塊的緩存機制

Python 程序是由代碼塊構(gòu)造的。塊是一個 Python 程序的文本,它是作為一個單元執(zhí)行的。
代碼塊:一個模塊, 一個函數(shù), 一個類, 一個文件等都是一個代碼塊;
交互方式:在 cmd 中進入 Python 解釋器里面,輸入的每一條命令都是一個代碼塊;

Python 在執(zhí)行同一個代碼塊的初始化對象的命令時,會檢查其值是否存在,如果存在,會將其重用;
滿足代碼塊的緩存機制則它們在內(nèi)存中只存在一個,即:id相同;
代碼塊的緩存機制的適用范圍: int(float),str,bool;

int(float): 任何數(shù)字在同一代碼塊下都會復用;
bool: True 和 False 在字典中會以 1,0 方式存在,并且復用;
str:同一代碼塊中,值相同的字符串在內(nèi)存中只存在一個:

s1 = 'janes@!#*ewq'
s2 = 'janes@!#*ewq'
print(s1 is s2)	 # True 

a1 = 'janes45613256132!@#$%#^%@$%' * 1
b1 = 'janes45613256132!@#$%#^%@$%' * 1
print(a1 is b1) # True

s1 = 'hah_' * 6
s2 = 'hah_' * 6
print(s1 is s2) # True

2.小數(shù)據(jù)池

Python 自動將 -5~256 的整數(shù)進行了緩存,當你將這些整數(shù)賦值給變量時,并不會重新創(chuàng)建對象,而是使用已經(jīng)創(chuàng)建好的緩存對象;
Python會將滿足一定規(guī)則的字符串在字符串駐留池中,創(chuàng)建一份,當你將這些字符串賦值給變量時,并不會重新創(chuàng)建對象, 而是使用在字符串駐留池中創(chuàng)建好的對象;
bool 值就是 True,F(xiàn)alse,無論你創(chuàng)建多少個變量指向 True,F(xiàn)alse,它在內(nèi)存中都只存在一個;

小數(shù)據(jù)池也是只針對 int(float),str,bool;
小數(shù)據(jù)池是針對不同代碼塊之間的緩存機制;

# cmd, -5~256 的小整數(shù)雖然不在同一代碼塊中, 但是它們適用小數(shù)據(jù)池機制
>>>a = 245
>>>b = 245
>>>a is b # True
# 長度為0與1的字符串一定會被駐留;
# 字符串駐留發(fā)生在程序編譯時;
# 被駐留的字符串必須由 ASCll字母, 數(shù)字以及下劃線組成;
>>>s1 = '@'
>>>s2 = '@'
>>>s1 is s2 # True

>>>s1 = ''
>>>s2 = ''
>>>s1 is s2 # True

>>>s1 = 'a_b_c'
>>>s2 = 'a_b_c'
>>>s1 is s2 # True

>>>s1 = 'a b_c'
>>>s2 = 'a b_c'
>>>s1 is s2 # False

>>>s1 = 'a_b_c' * 1
>>>s2 = 'a_b_c' * 1
>>>s1 is s2 # True

>>>s1 = 'abd_d23' * 3
>>>s2 = 'abd_d23' * 3
>>>s1 is s2 # True

>>>a, b = "some_thing!", "some_thing!"
>>>a is b # False

>>>a, b = "some_thing", "some_thing"
>>>a is b # True
a1 = 1000
b1 = 1000
a1 is b1 # True

class C1(object): 
   a = 100
   b = 100
   c = 1000
   d = 1000
 
 
class C2(object):
   a = 100
   b = 1000

print(C1.a is C1.b)  # True
print(C1.a is C2.a)  # True
print(C1.c is C1.d)  # True
print(C1.c is C2.b)  # False

3.優(yōu)缺點

優(yōu)點:值相同的字符串的(比如標識符),直接從池里拿來用,避免頻繁的創(chuàng)建和銷毀,提升效率,節(jié)約內(nèi)存;

缺點:拼接字符串、對字符串修改之類的影響性能;
因為是不可變的,所以對字符串修改不是 inplace 就地操作,要新建對象,這也是為什么拼接多字符串的時候不建議用 + 而用 join();
join() 是先計算出所有字符串的長度,然后一一拷貝,只 new 一次對象;

小整數(shù)對象池

為避免整數(shù)頻繁申請和銷毀內(nèi)存空間,python 使用了小整數(shù)對象池,Python 對小整數(shù)的定義是 [-5, 256] ,這些整數(shù)對象是提前建立好的,不會被垃圾回收;
一個 Python 程序中,無論這個整數(shù)處于 LEGB 中哪個位置,所有位于這個范圍內(nèi)的整數(shù)使用的都是同一個對象;

# 3.7.5, ipython7.18.1
a = -5
b = -5
a is b # True

a = -6
b = -6
a is b # False

a = 256
b = 256
a is b # True

a = 257
b = 257
a is b # Flase

大整數(shù)對象池

cmd 終端中,大整數(shù)每賦值一次,每次的大整數(shù)都會重新創(chuàng)建,Pycharm 中,每次運行時,所有代碼都加載到內(nèi)存中,屬于一個整體,所以這個時候會有一個大整數(shù)對象池處于一個代碼塊的大整數(shù)是同一個對象;
c 和 d 處于一個代碼塊,而 C1.b 和 C2.b 分別有自己的代碼塊,所以不相等;

# cmd 終端
a = 1000
b = 1000
a is b # False
--------------------
class C1(object): 
   a = 100
   b = 100
   c = 1000
   d = 1000
 
 
class C2(object):
   a = 100
   b = 1000

print(C1.a is C1.b)  # True
print(C1.a is C2.a)  # True
print(C1.c is C1.d)  # True ?? 難道 cmd 中也有大整數(shù)池 ?? 類加載的時候是在一塊內(nèi)存中,同值同地址 ?? 
print(C1.c is C2.b)  # False

# pycharm 等編輯器中
a = 1000
b = 1000
a is b # True
--------------------
class C1(object): 
   a = 100
   b = 100
   c = 1000
   d = 1000
 
 
class C2(object):
   a = 100
   b = 1000

print(C1.a is C1.b)  # True
print(C1.a is C2.a)  # True
print(C1.c is C1.d)  # True
print(C1.c is C2.b)  # False

字符串駐留機制

  Python 解釋器為了提高字符串使用的效率和使用性能,編譯時,使用了 intern(字符串駐留)技術(shù)來提高字符串效率,什么是 intern 機制?即值同樣的字符串對象僅僅會保存一份,放在一個字符串儲蓄池中,是共用的,當然,肯定不能改變,這也決定了字符串必須是不可變對象(整數(shù)類型也是不可變對象)??,浮點數(shù)就不行 ;

簡單原理:

  實現(xiàn) Intern 保留機制的方式非常簡單,就是通過維護一個字符串儲蓄池,這個池子是一個字典結(jié)構(gòu),編譯時,如果字符串已經(jīng)存在于池子中就不再去創(chuàng)建新的字符串,直接返回之前創(chuàng)建好的字符串對象,如果之前還沒有加入到該池子中,則先構(gòu)造一個字符串對象,并把這個對象加入到池子中去,方便下一次獲取。;
  但是,解釋器內(nèi)部對intern 機制的使用策略是有考究的,有些場景會自動使用 intern ,有些地方需要通過手動方式才能啟動,看下面幾個常見情景:

# cmd 中浮點數(shù)沒有被緩存
a = 1.0
b = 1.0
a is b # False

# cmd 中并非全部的字符串都會采用intern機制; 僅 包括下劃線、數(shù)字、字母的字符串才會被 intern--類標識符
s1="hello"
s2="hello"
s1 is s2 # True

# 如果有空格,默認不啟用intern機制
s1="hell o"
s2="hell o"
s1 is s2 # False

s1 = "hell!*o"
s2 = "hell!*o"
print(s1 is s2) # False

# 如果一個字符串長度超過20個字符,不啟動intern機制 -- 看網(wǎng)上很多都是這么寫的, 不超過二十個就為真,但是我在自己 3.7/8.5 版本上試了一下,發(fā)現(xiàn)好像沒有限制,不知道是 Python 更新了,還是什么問題……
s1 = "a" * 20
s2 = "a" * 20
s1 is s2 # True

s1 = "a" * 21
s2 = "a" * 21
s1 is s2 # True

s1 = "ab" * 10
s2 = "ab" * 10
s1 is s2 # True

s1 = "ab" * 11
s2 = "ab" * 11
s1 is s2 # True

# 'kz' + 'c' 編譯時已經(jīng)變成 'kzc',而 s1 + 'c' 中 s1 是變量, 會在運行時進行拼接,所以沒有被intern?
'kz' + 'c' is 'kzc' # True

s1 = 'kz'
s2 = 'kzc'
s1+'c' is 'kzc' # False

# pycharm 等編輯器中,只要是同一個字符串,都為 True,并不用是下劃線、數(shù)字、字母的字符串
s1 = "hell o"
s2 = "hell o"
print(s1 is s2) # True

s1 = "hell!*o"
s2 = "hell!*o"
print(s1 is s2) # True

s1 = "a" * 20
s2 = "a" * 20
print(s1 is s2) # True

s1 = "a" * 21
s2 = "a" * 21
print(s1 is s2) # True

s1 = "ab" * 10
s2 = "ab" * 10
print(s1 is s2) # True

s1 = "ab" * 11
s2 = "ab" * 11
print(s1 is s2) # True

'kz' + 'c' is 'kzc' # True

s1 = 'kz'
s2 = 'kzc'
s1+'c' is 'kzc' # False

# 編輯器中,float 也被緩存了
a = 1.0
b = 1.0
a is b

以上就是詳解Python 小數(shù)據(jù)池和代碼塊緩存機制的詳細內(nèi)容,更多關(guān)于Python 小數(shù)據(jù)池和代碼塊緩存機制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • pytorch中的model=model.to(device)使用說明

    pytorch中的model=model.to(device)使用說明

    這篇文章主要介紹了pytorch中的model=model.to(device)使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python實現(xiàn)一般游戲的自動點擊具體操作

    python實現(xiàn)一般游戲的自動點擊具體操作

    這篇文章主要介紹了python實現(xiàn)一般游戲的自動點擊,本文給大家分享具體操作代碼及需要的軟件,需要的朋友可以參考下
    2021-10-10
  • Python中enumerate()函數(shù)詳細分析(附多個Demo)

    Python中enumerate()函數(shù)詳細分析(附多個Demo)

    Python的enumerate()函數(shù)是一個內(nèi)置函數(shù),主要用于在遍歷循環(huán)中獲取每個元素的索引以及對應(yīng)的值,這篇文章主要介紹了Python中enumerate()函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • Python csv文件的讀寫操作實例詳解

    Python csv文件的讀寫操作實例詳解

    這篇文章主要介紹了Python csv文件的讀寫操作實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • python中web框架的自定義創(chuàng)建

    python中web框架的自定義創(chuàng)建

    這篇文章主要為大家詳細介紹了python中web框架的自定義創(chuàng)建,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • OpenCV?光流Optical?Flow示例

    OpenCV?光流Optical?Flow示例

    這篇文章主要為大家介紹了OpenCV?光流Optical?Flow示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • python匿名函數(shù)的使用方法解析

    python匿名函數(shù)的使用方法解析

    這篇文章主要介紹了python匿名函數(shù)的使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Python爬取你好李煥英豆瓣短評生成詞云的示例代碼

    Python爬取你好李煥英豆瓣短評生成詞云的示例代碼

    這篇文章主要介紹了Python爬取你好李煥英豆瓣短評生成詞云,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • python pandas cumsum求累計次數(shù)的用法

    python pandas cumsum求累計次數(shù)的用法

    這篇文章主要介紹了python pandas cumsum求累計次數(shù)的用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Python bsddb模塊操作Berkeley DB數(shù)據(jù)庫介紹

    Python bsddb模塊操作Berkeley DB數(shù)據(jù)庫介紹

    這篇文章主要介紹了Python bsddb模塊操作Berkeley DB數(shù)據(jù)庫介紹,這里簡單介紹一些關(guān)于bsddb的使用方法,需要的朋友可以參考下
    2015-04-04

最新評論