1. 程式人生 > >python 淺談小數據池和編碼

python 淺談小數據池和編碼

must 1byte some none 不同的 布爾值 語句 script standard

?. ?數據池

  在說?數據池之前. 我們先看?個概念. 什麽是代碼塊:

根據提示我們從官??檔找到了這樣的說法:
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 as
standard 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 block
is 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 : 最早的編碼. ??有英??寫字?, ?寫字?, 數字, ?些特殊字符. 沒有中?,801代碼, 8bit, 1byte
  2. GBK: 中?國標碼, ??包含了ASCII編碼和中?常?編碼. 16bit, 2byte
  3. UNICODE: 萬國碼, ??包含了全世界所有國家?字的編碼. 32bit, 4byte, 包含了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

結果:
balexbalex

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 淺談小數據池和編碼