首頁 > 軟體

Python內建型別str原始碼學習

2022-05-17 19:01:25

引言

“深入認識Python內建型別”這部分的內容會從原始碼角度為大家介紹Python中各種常用的內建型別。

在介紹常用型別str之前,在上一篇部落格:Python原始碼學習筆記:深入認識Python內建型別——bytes已經為大家介紹了和str息息相關的bytes的原始碼知識。這篇部落格回味大家分析str相關的原始碼。

1 Unicode

計算機儲存的基本單位是位元組,由8個位元位組成。由於英文只由26個字母加若干符號組成,因此英文字元可以直接用位元組來儲存。但是其他語言(例如中日韓等),由於字元眾多,不得不使用多個位元組來進行編碼。

隨著計算機技術的傳播,非拉丁文字元編碼技術不斷髮展,但是仍然存在兩個比較大的侷限性:

  • 不支援多語言:一種語言的編碼方案不能用於另外一種語言
  • 沒有統一標準:例如中文就有GBK、GB2312、GB18030等多種編碼標準

由於編碼方式不統一,開發人員就需要在不同編碼之間來回轉換,不可避免地會出現很多錯誤。為了解決這類不統一問題,Unicode標準被提出了。Unicode對世界上大部分文字系統進行整理、編碼,讓計算機可以用統一的方式處理文字。Unicode目前已經收錄了超過14萬個字元,天然地支援多語言。(Unicode的uni就是“統一”的詞根)

2 Python中的Unicode

2.1 Unicode物件的好處

Python在3之後,str物件內部改用Unicode表示,因此在原始碼中成為Unicode物件。使用Unicode表示的好處是:程式核心邏輯統一使用Unicode,只需在輸入、輸出層進行解碼、編碼,可最大程度地避免各種編碼問題。

圖示如下:

2.2 Python對Unicode的優化

問題:由於Unicode收錄字元已經超過14萬個,每個字元至少需要4個位元組來儲存(這裡應該是因為2個位元組不夠,所以才用4個位元組,一般不會使用3個位元組)。而英文字元用ASCII碼錶示僅需要1個位元組,使用Unicode反而會使頻繁使用的英文字元的開銷變為原來的4倍。

首先我們來看一下Python中不同形式的str物件的大小差異:

>>> sys.getsizeof('ab') - sys.getsizeof('a')
1
>>> sys.getsizeof('一二') - sys.getsizeof('一')
2
>>> sys.getsizeof('

IT145.com E-mail:sddin#qq.com