python 淺談小數據池和編碼
?. ?數據池
在說?數據池之前. 我們先看?個概念. 什麽是代碼塊:
根據提示我們從官??檔找到了這樣的說法: A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given asstandard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block. A code blockis executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block’s execution has completed.
粗略的翻譯: python程序是由代碼塊構成的. ?個代碼塊的?本作為python程序執?的單元. 代碼塊: ?個模塊, ?個函數, ?個類, 甚?每?個command命令都是?個代碼塊. ?個?件也是? 個代碼塊, eval()和exec()執?的時候也是?個代碼塊
二、接下來我們來看一下小數據池is和 ==的區別
1、id( )
通過id( )我們可以查看到一個變量表示的值的內存地址
s = ‘alex‘ print(id(s)) # 4326667072
2、is和==
== 判斷左右兩段的值是否相等,是否一致
is 判斷左右兩端的內存地址是否一致,如果一致就返回True
註意:如果內存地址相同. 那麽值?定是相等的;如果值相等. 則不?定是同?個對象 。
3、?數據池.:?種數據緩存機制. 也被稱為駐留機制.
?數據池只針對: 整數, 字符串, 布爾值. 其他的數據類型不存在駐留機制 。
對於整數, Python官??檔中這麽說: The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined. 對於字符串: Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. –引?維基百科
在python中對-5到256之間的整數會被駐留在內存中,將一定規則的字符串緩存,在使用的時候,內存中只會創建一個該數據的對象,保存小數據池中,當使用的時候直接從
小數據池中獲取對象的內存引用,二不需要創建一個新的數據,這樣可以節省更多的內存。
優點:能夠提高一些字符串、整數的處理速度,省去了創建對象的過程。
缺點:在”池“中插入或者創建新值會花費更多時間。
對於數字: -5~256是會被加到?數據池中的. 每次使?都是同?個對象.
對於字符串:
1. 如果字符串的?度是0或者1, 都會默認進?緩存
2. 字符串?度?於1, 但是字符串中只包含字?, 數字, 下劃線時才會緩存
3. ?乘法的到的字符串. ①. 乘數為1, 僅包含數字, 字?, 下劃線時會被緩存. 如果
包含其他字符, ??度<=1 也會被駐存, ②. 乘數?於1 . 僅包含數字, 字?, 下劃
線這個時候會被緩存. 但字符串?度不能?於20
4. 指定駐留. 我們可以通過sys模塊中的intern()函數來指定要駐留的內容.
a = 1000 b = 1000 print(a is b) 註意. 在py?件中.得到的結果是True, 但是在command中就不是了.
在代碼塊內的緩存機制是不?樣的. 在執?同?個代碼塊的初始化對象的命令時, 會檢查是否其值是否已經存在, 如果存在, 會將其重?. 換句話說: 執?同?個代碼塊時,
遇到初始化對象的命令時, 他會將初始化的這個變量與值存儲在?個字典中, 在遇到新的變量時, 會先在字典中查詢記錄, 如果有同樣的記錄那麽它會重復使?這個字典中的
之前的這個值. 所以在你給出的例?中, ?件執?時(同?個代碼塊) 會把a, b兩個變量指向同?個對象.如果是不同的代碼塊, 他就會看這個兩個變量是否是滿??數據池的數據,
如果是滿??數據池的數據則會指向同?個地址. 所以: a, b的賦值語句分別被當作兩個代碼塊執?, 但是他們不滿??數據池的數據所以會得到兩個不同的對象, 因?is判斷
返回False.
三、編碼
1. ASCII : 最早的編碼. ??有英??寫字?, ?寫字?, 數字, ?些特殊字符. 沒有中?,8個01代碼, 8個bit, 1個byte
2. GBK: 中?國標碼, ??包含了ASCII編碼和中?常?編碼. 16個bit, 2個byte
3. UNICODE: 萬國碼, ??包含了全世界所有國家?字的編碼. 32個bit, 4個byte, 包含了ASCII
4. UTF-8: 可變?度的萬國碼. 是unicode的?種實現. 最?字符占8位
1.英?: 8bit 1byte
2.歐洲?字:16bit 2byte
3.中?:24bit 3byte
在python3的內存中,在程序運行階段,使用的是unicode編碼。因為unicode是萬國碼,什麽內容都可以進行顯示,
那麽在數據傳輸和存儲的時候由於unicode比較浪費時間和資源。需要把unicode轉村委utf-8或者gbk進行存儲。
在python中可以把文字信息進行編碼。編碼以後的內容就可以進行傳輸了,編碼以後的數據都是bytes類型的數據,其實
原來的數據只是被編碼了,並沒有改變信息內容。
5、bytes的表現形式:
1、英文 b‘ alex’ 引文的表現形式跟字符串沒什麽區別
2、中文 b‘\xe4\xb8\xad‘ 這是一個漢字的utf-8的bytes表現形式。
字符串在傳輸時轉化成bytes=> encode(字符集)來完成
s = "alex" print(s.encode("utf-8")) # 將字符串編碼成UTF-8 print(s.encode("GBK")) # 將字符串編碼成GBK 結果: b‘alex‘b‘alex‘ s = "中" print(s.encode("UTF-8")) # 中?編碼成UTF-8 print(s.encode("GBK")) # 中?編碼成GBK 結果: b‘\xe4\xb8\xad‘ b‘\xd6\xd0
解碼
s = "我叫李嘉誠" print(s.encode("utf-8")) # b‘\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a‘ print(b‘\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a‘.decode("utf-8")) # 解碼
編碼和解碼的時候都需要制定編碼格式.
s = "我是?字" bs = s.encode("GBK") # 我們這樣可以獲取到GBK的?字 # 把GBK轉換成UTF-8 # ?先要把GBK轉換成unicode. 也就是需要解碼 s = bs.decode("GBK") # 解碼 # 然後需要進?重新編碼成UTF-8 bss = s.encode("UTF-8") # 重新編碼 print(bss)
python 淺談小數據池和編碼