亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Python > 正文

詳解字符串在Python內部是如何省內存的

2024-09-09 19:03:41
字體:
來源:轉載
供稿:網友

起步

Python3 起,str 就采用了 Unicode 編碼(注意這里并不是 utf8 編碼,盡管 .py 文件默認編碼是 utf8 )。 每個標準 Unicode 字符占用 4 個字節。這對于內存來說,無疑是一種浪費。

Unicode 是表示了一種字符集,而為了傳輸方便,衍生出里如 utf8 , utf16 等編碼方案來節省存儲空間。Python內部存儲字符串也采用了類似的形式。

三種內部表示Unicode字符串

為了減少內存的消耗,Python使用了三種不同單位長度來表示字符串:

每個字符 1 個字節(Latin-1) 每個字符 2 個字節(UCS-2) 每個字符 4 個字節(UCS-4)

源碼中定義字符串結構體:

# Include/unicodeobject.htypedef uint32_t Py_UCS4;typedef uint16_t Py_UCS2;typedef uint8_t Py_UCS1;# Include/cpython/unicodeobject.htypedef struct {  PyCompactUnicodeObject _base;  union {    void *any;    Py_UCS1 *latin1;    Py_UCS2 *ucs2;    Py_UCS4 *ucs4;  } data;           /* Canonical, smallest-form Unicode buffer */} PyUnicodeObject;

如果字符串中所有字符都在 ascii 碼范圍內,那么就可以用占用 1 個字節的 Latin-1 編碼進行存儲。而如果字符串中存在了需要占用兩個字節(比如中文字符),那么整個字符串就將采用占用 2 個字節 UCS-2 編碼進行存儲。

這點可以通過 sys.getsizeof 函數外部窺探來驗證這個結論:

如圖,存儲 'zh' 所需的存儲空間比 'z' 多 1 個字節, h 在這里占了 1 個字節;

存儲 'z中' 所需的存儲空間比 '中' 多了 2 個字節,z 在這里占了 2 個字節。

大多數的自然語言采用 2 字節的編碼就夠了。但如果有一個 1G 的 ascii 文本加載到內存后,在文本中插入了一個 emoji 表情,那么字符串所需的空間將擴大到 4 倍,是不是很驚喜。

為什么內部不采用 utf8 進行編碼

最受歡迎的 Unicode 編碼方案,Python內部卻不使用它,為什么?

這里就得說下 utf8 編碼帶來的缺點。這種編碼方案每個字符的占用字節長度是變化的,這就導致了無法按所以隨機訪問單個字符,例如 string[n] (使用utf8編碼)則需要先統計前n個字符占用的字節長度。所以由 O(1) 變成了 O(n) ,這更無法讓人接受。

因此Python內部采用了定長的方式存儲字符串。

字符串駐留機制

另一個節省內存的方式就是將一些短小的字符串做成池,當程序要創建字符串對象前檢查池中是否有滿足的字符串。在內部中,僅包含下劃線(_)、字母 和 數字 的長度不高過 20 的字符串才能駐留。駐留是在代碼編譯期間進行的,代碼中的如下會進行駐留檢查:

空字符串 '' 及所有; 變量名; 參數名; 字符串常量(代碼中定義的所有字符串); 字典鍵; 屬性名稱;

駐留機制節省大量的重復字符串內存。在內部,字符串駐留池由一個全局的 dict 維護,該字段將字符串用作鍵:

void PyUnicode_InternInPlace(PyObject **p){  PyObject *s = *p;  PyObject *t;  if (s == NULL || !PyUnicode_Check(s))    return;  // 對PyUnicodeObjec進行類型和狀態檢查  if (!PyUnicode_CheckExact(s))    return;  if (PyUnicode_CHECK_INTERNED(s))    return;  // 創建intern機制的dict  if (interned == NULL) {    interned = PyDict_New();    if (interned == NULL) {      PyErr_Clear(); /* Don't leave an exception */      return;    }  }  // 對象是否存在于inter中  t = PyDict_SetDefault(interned, s, s);  // 存在, 調整引用計數  if (t != s) {    Py_INCREF(t);    Py_SETREF(*p, t);    return;  }  /* The two references in interned are not counted by refcnt.    The deallocator will take care of this */  Py_REFCNT(s) -= 2;  _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久偷看各类女兵18女厕嘘嘘| 欧美在线视频一二三| 亚洲成av人影院在线观看| 日韩福利在线播放| 超薄丝袜一区二区| 亚洲女人初尝黑人巨大| 91九色单男在线观看| 另类色图亚洲色图| 欧美激情精品久久久| 国内精品国产三级国产在线专| 国产精品xxxxx| 国产日韩精品一区二区| 国产精品日韩欧美综合| 亚洲精品资源在线| 日韩经典中文字幕| 国产91精品不卡视频| 亚洲成人精品久久久| 亚洲丝袜在线视频| 久操成人在线视频| 亚洲人a成www在线影院| 欧美丝袜美女中出在线| 国产精品久久一区主播| 亚洲欧美在线一区二区| 精品久久久久久久久久久| 国产精品视频导航| 国产69精品久久久久9| 欧美性猛交xxxx乱大交极品| 久久精品最新地址| 亚洲国产精品va在线看黑人| 亚洲人成网站999久久久综合| 欧美人在线视频| 欧美亚洲日本网站| 欧美成年人视频网站| 中文字幕在线看视频国产欧美在线看完整| 欧美中文字幕视频| 97精品伊人久久久大香线蕉| 欧洲亚洲免费在线| 亚洲精品久久久一区二区三区| 国产精品wwww| 日韩av最新在线观看| 亚洲三级 欧美三级| 九九热最新视频//这里只有精品| 伊人久久五月天| 亚洲一区二区免费在线| 日韩欧美一区二区三区| 91夜夜未满十八勿入爽爽影院| 国产精品网址在线| 久久99精品久久久久久青青91| 亚洲精品之草原avav久久| 欧美另类在线播放| 色偷偷av一区二区三区乱| 欧美日韩在线观看视频小说| 538国产精品一区二区在线| 国模极品一区二区三区| 精品亚洲夜色av98在线观看| 欧美午夜精品伦理| 国产视频精品久久久| 欧美一区二三区| 欧美亚洲午夜视频在线观看| 一区二区三区黄色| 欧美大片欧美激情性色a∨久久| 欧美午夜视频一区二区| 狠狠躁天天躁日日躁欧美| 亚洲一区国产精品| 91av在线免费观看| 九九精品在线视频| 成人国产精品久久久久久亚洲| 精品久久久一区| 成人精品aaaa网站| 亚洲影院色在线观看免费| 国产suv精品一区二区| 亚洲免费视频在线观看| 97视频在线观看网址| 国产偷亚洲偷欧美偷精品| 欧美激情视频三区| 亚洲二区在线播放视频| 国产日本欧美一区二区三区在线| 欧美专区日韩视频| 1769国内精品视频在线播放| 成人日韩在线电影| 欧美成人全部免费| 亚洲精品视频网上网址在线观看| 中文字幕精品网| 国产成人精品免高潮费视频| 亚洲xxxx视频| 亚洲最大的成人网| www.国产精品一二区| 色综合久久88色综合天天看泰| 日韩精品在线视频| 国产噜噜噜噜久久久久久久久| 岛国精品视频在线播放| 欧美久久精品一级黑人c片| 国产精品亚洲第一区| 国产日韩中文字幕在线| 91av免费观看91av精品在线| 91成人在线视频| 久久久999精品视频| 国产精品wwwwww| 亚洲一级黄色片| 17婷婷久久www| 永久555www成人免费| 91丝袜美腿美女视频网站| 亚洲女人天堂色在线7777| 国产精品久久999| 久久免费视频网站| 色婷婷综合成人av| 日韩国产在线播放| 欧美精品免费看| 国产亚洲成精品久久| 亚洲精品aⅴ中文字幕乱码| 亚洲一区二区三区香蕉| 久久躁日日躁aaaaxxxx| 青草青草久热精品视频在线网站| 国产亚洲欧美aaaa| 欧美性色视频在线| 久热精品视频在线观看一区| 午夜剧场成人观在线视频免费观看| 美女撒尿一区二区三区| 日韩美女福利视频| 国产日韩欧美日韩大片| 亚洲精品丝袜日韩| 啊v视频在线一区二区三区| 欧美极品美女视频网站在线观看免费| 欧美疯狂性受xxxxx另类| 久久国产精品99国产精| xvideos亚洲人网站| 成人黄色在线免费| 欧美影院在线播放| 亚洲午夜激情免费视频| 日韩免费av片在线观看| 亚洲欧美国产精品| 最近2019免费中文字幕视频三| 日韩在线免费视频观看| 国产精品男人的天堂| 国产精品吴梦梦| 欧洲亚洲在线视频| 日韩高清免费在线| 国产精品高潮呻吟视频| 5278欧美一区二区三区| 最近2019免费中文字幕视频三| 18性欧美xxxⅹ性满足| 亚洲人成网7777777国产| 欧美日韩在线影院| 国产日韩专区在线| 日韩av在线播放资源| 欧美亚洲视频在线观看| 91九色单男在线观看| 国产精品视频一区二区三区四| 538国产精品一区二区免费视频| 日本电影亚洲天堂| 国产欧美最新羞羞视频在线观看| 亚洲欧洲日产国码av系列天堂| 狠狠躁天天躁日日躁欧美| 亚洲天堂av高清| 亚洲成年网站在线观看| 国产精品免费一区二区三区都可以| 91精品国产高清久久久久久久久| 亚洲男人的天堂网站| 日本一区二区三区在线播放| 精品亚洲男同gayvideo网站| 高清亚洲成在人网站天堂| 亚洲成人教育av| 久久久亚洲精选| 国产成人精品在线视频|