Python的數據緩存
python 的內置數據類型,數值型,字符串,列表,字典等都會有自己的對象緩存池,
這樣做的好處是,避免了頻繁的申請內存,釋放內存,這樣會極大的降低應用程序的運行速度,還會造成大量的內存碎片。因此提供對象緩存機制是非常重要的。
在Python中,字符串和整型對象都是不可變的(immutable)類型
,因此Python會很高效地緩存它們。這樣的處理機制能提升Python的性能。因此,我們看到下面示例中str1和str2也都是指向同一塊內存地址:
str1='a'
str2='a'
id(str1)==id(str2)
True
當然,對於int(整形)數據也是如此
a=1
b=1
id(a)==id(b)
True
接下來請注意:
a=-7
b=-7
id(a)==id(b)
False
震驚!居然不一樣!
str1='aasfasfas'
str2='abcfasfas'
id(str1)==id(str2)
False
字符串也是如此!
解釋
Python能夠幫我們緩存多少呢?Python2.3簡單整數緩存范圍是(-1,100),Python2.5.4以后簡單整數緩存范圍至少是(-5,256)。所有的短字符也都在緩存區,但是tuple()不可以
x = (1,2)
y = (1,2)
id(x) == id(y)
False
這是因為在Python中符號()不僅僅是元組,它被重載為分組操作符,由圓括號()包裹的單一元素首先被當做分組操作,而不是元組
BUG here ??
交互式命令行中運行
a=888
b=888
id(a)==id(b)
False
a is b
False
Pycharm中運行
a = 888
b = 888
print(a is b) >>True
print(id(a) == id(b)) >>True
兩種不同的運行方式,第一種是直接采用解釋器運行,第二種是把代碼當做腳本運行,結果居然不一樣
關於這個BUG,經過我多日通宵研究,是這樣子的
-
出於性能考慮,Python內部做了進一步優化,怎么優化呢?但凡是在同一個代碼塊中的代碼,如果出現兩個值相同的整數,那么它們將被重用
-
上面代碼是在一個test.py文件中,運行時,a和b的id值相同,因為a、b 在同一個代碼塊,屬於模塊級別,創建 b 的時候,發現同級代碼塊中有個b的值了,就重用了這個對象。
-
在 Python 的交互式命令行中,每單獨一行都視為一個代碼塊,同一行中的代碼屬於同一個代碼塊,因此不難理解,創建b時候無法引用a。
-
換句話說,以文件腳本形式執行的時候,會先將源碼翻譯為字節碼,也就是pyc或者pyo文件,Pythoin解釋器會自動重復引用一些變量,以節省內存使用。在控制台執行的時候,代碼是以交互形式逐行執行的,解釋器不會進行優化,但對於一些常見的數字和字符串,還是會有優化。范圍【-5~256】