成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 詳解python字符串駐留技術

詳解python字符串駐留技術

熱門標簽:沈陽防封電銷卡品牌 外呼系統(tǒng)哪些好辦 武漢外呼系統(tǒng)平臺 沈陽外呼系統(tǒng)呼叫系統(tǒng) 如何申請400電話費用 江西省地圖標注 富錦商家地圖標注 沈陽人工外呼系統(tǒng)價格 池州外呼調(diào)研線路

前言

每種編程語言為了表現(xiàn)出色,并且實現(xiàn)卓越的性能,都需要有大量編譯器級與解釋器級的優(yōu)化。

由于字符串是任何編程語言中不可或缺的一個部分,因此,如果有快速操作字符串的能力,就可以迅速地提高整體的性能。

在本文中,我們將深入研究 Python 的內(nèi)部實現(xiàn),并了解 Python 如何使用一種名為字符串駐留(String Interning)的技術,實現(xiàn)解釋器的高性能。本文的目的不僅在于介紹 Python 的內(nèi)部知識,而且還旨在使讀者能夠輕松地瀏覽 Python 的源代碼;因此,本文中將有很多出自CPython的代碼片段。

全文提綱如下:

1、什么是“字符串駐留”?

字符串駐留是一種編譯器/解釋器的優(yōu)化方法,它通過緩存一般性的字符串,從而節(jié)省字符串處理任務的空間和時間。

這種優(yōu)化方法不會每次都創(chuàng)建一個新的字符串副本,而是僅為每個適當?shù)牟豢勺冎当A粢粋€字符串副本,并使用指針引用之。每個字符串的唯一拷貝被稱為它的intern,并因此而得名 String Interning。

String Interning 一般被譯為“字符串駐留”或“字符串留用”,在某些語言中可能習慣用 String Pool(字符串常量池)的概念,其實是對同一種機制的不同表述。intern 作為名詞時,是“實習生、實習醫(yī)生”的意思,在此可以理解成“駐留物、駐留值”。

查找字符串 intern 的方法可能作為公開接口公開,也可能不公開?,F(xiàn)代編程語言如 Java、Python、PHP、Ruby、Julia 等等,都支持字符串駐留,以使其編譯器和解釋器做到高性能。

2、為什么要駐留字符串?

字符串駐留提升了字符串比較的速度。如果沒有駐留,當我們要比較兩個字符串是否相等時,它的時間復雜度將上升到 O(n),即需要檢查兩個字符串中的每個字符,才能判斷出它們是否相等。

但是,如果字符串是固定的,由于相同的字符串將使用同一個對象引用,因此只需檢查指針是否相同,就足以判斷出兩個字符串是否相等,不必再逐一檢查每個字符。由于這是一個非常普遍的操作,因此,它被典型地實現(xiàn)為指針相等性校驗,僅使用一條完全沒有內(nèi)存引用的機器指令。

字符串駐留減少了內(nèi)存占用。Python 避免內(nèi)存中充斥多余的字符串對象,通過享元設計模式共享和重用已經(jīng)定義的對象,從而優(yōu)化內(nèi)存占用。

3、Python的字符串駐留

像大多數(shù)其它現(xiàn)代編程語言一樣,Python 也使用字符串駐留來提高性能。在 Python 中,我們可以使用is運算符,檢查兩個對象是否引用了同一個內(nèi)存對象。

因此,如果兩個字符串對象引用了相同的內(nèi)存對象,則is運算符將得出True,否則為False。

 >>> 'python' is 'python'

  True

我們可以使用這個特定的運算符,來判斷哪些字符串是被駐留的。在 CPython 的,字符串駐留是通過以下函數(shù)實現(xiàn)的,聲明在 unicodeobject.h 中,定義在 unicodeobject.c 中。

PyAPI_FUNC(void) PyUnicode_InternInPlace(PyObject **);

為了檢查一個字符串是否被駐留,CPython 實現(xiàn)了一個名為PyUnicode_CHECK_INTERNED的宏,同樣是定義在 unicodeobject.h 中。

這個宏表明了 Python 在PyASCIIObject結(jié)構(gòu)中維護著一個名為interned的成員變量,它的值表示相應的字符串是否被駐留。

#define PyUnicode_CHECK_INTERNED(op) \

      (((PyASCIIObject *)(op))->state.interned)

4、字符串駐留的原理

在 CPython 中,字符串的引用被一個名為interned的 Python 字典所存儲、訪問和管理。 該字典在第一次調(diào)用字符串駐留時,被延遲地初始化,并持有全部已駐留字符串對象的引用。

4.1 如何駐留字符串?

負責駐留字符串的核心函數(shù)是PyUnicode_InternInPlace,它定義在 unicodeobject.c 中,當調(diào)用時,它會創(chuàng)建一個準備容納所有駐留的字符串的字典interned,然后登記入?yún)⒅械膶ο螅钇滏I和值都使用相同的對象引用。

以下函數(shù)片段顯示了 Python 實現(xiàn)字符串駐留的過程。

void
  PyUnicode_InternInPlace(PyObject **p)
  {
      PyObject *s = *p;
  ​
      .........
  ​
      // Lazily build the dictionary to hold interned Strings
      if (interned == NULL) {
          interned = PyDict_New();
          if (interned == NULL) {
              PyErr_Clear();
              return;
          }
      }
  ​
      PyObject *t;
  ​
      // Make an entry to the interned dictionary for the
      // given object
      t = PyDict_SetDefault(interned, s, s);
  ​
      .........
 
      // The two references in interned dict (key and value) are
      // not counted by refcnt.
      // unicode_dealloc() and _PyUnicode_ClearInterned() take
      // care of this.
      Py_SET_REFCNT(s, Py_REFCNT(s) - 2);
  ​
      // Set the state of the string to be INTERNED
      _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL;
  }

4.2 如何清理駐留的字符串?

清理函數(shù)從interned字典中遍歷所有的字符串,調(diào)整這些對象的引用計數(shù),并把它們標記為NOT_INTERNED,使其被垃圾回收。一旦所有的字符串都被標記為NOT_INTERNED,則interned字典會被清空并刪除。

這個清理函數(shù)就是_PyUnicode_ClearInterned,在unicodeobject.c 中定義。

void
  _PyUnicode_ClearInterned(PyThreadState *tstate)
  {
      .........
  ​
      // Get all the keys to the interned dictionary
      PyObject *keys = PyDict_Keys(interned);
  ​
      .........
  ​
      // Interned Unicode strings are not forcibly deallocated;
      // rather, we give them their stolen references back
      // and then clear and DECREF the interned dict.
  ​
      for (Py_ssize_t i = 0; i  n; i++) {
          PyObject *s = PyList_GET_ITEM(keys, i);
  ​
          .........
  ​
          switch (PyUnicode_CHECK_INTERNED(s)) {
          case SSTATE_INTERNED_IMMORTAL:
              Py_SET_REFCNT(s, Py_REFCNT(s) + 1);
              break;
          case SSTATE_INTERNED_MORTAL:
              // Restore the two references (key and value) ignored
              // by PyUnicode_InternInPlace().
              Py_SET_REFCNT(s, Py_REFCNT(s) + 2);
              break;
          case SSTATE_NOT_INTERNED:
              /* fall through */
          default:
              Py_UNREACHABLE();
          }
  ​
          // marking the string to be NOT_INTERNED
          _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED;
      }
  ​
      // decreasing the reference to the initialized and
      // access keys object.
      Py_DECREF(keys);
  ​
      // clearing the dictionary
      PyDict_Clear(interned);
  ​
      // clearing the object interned
      Py_CLEAR(interned);
  }

5、字符串駐留的實現(xiàn)

既然了解了字符串駐留及清理的內(nèi)部原理,我們就可以找出 Python 中所有會被駐留的字符串。

為了做到這點,我們要做的就是在 CPython 源代碼中查找PyUnicode_InternInPlace 函數(shù)的調(diào)用,并查看其附近的代碼。下面是在 Python 中關于字符串駐留的一些有趣的發(fā)現(xiàn)。

5.1 變量、常量與函數(shù)名

CPython 對常量(例如函數(shù)名、變量名、字符串字面量等)執(zhí)行字符串駐留。

以下代碼出自codeobject.c,它表明在創(chuàng)建新的PyCode對象時,解釋器將對所有編譯期的常量、名稱和字面量進行駐留。

PyCodeObject *
  PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount,
                            int nlocals, int stacksize, int flags,
                            PyObject *code, PyObject *consts, PyObject *names,
                            PyObject *varnames, PyObject *freevars, PyObject *cellvars,
                            PyObject *filename, PyObject *name, int firstlineno,
                            PyObject *linetable)
  {
  ​
      ........
  ​
      if (intern_strings(names)  0) {
          return NULL;
      }
  ​
      if (intern_strings(varnames)  0) {
          return NULL;
      }
  ​
      if (intern_strings(freevars)  0) {
          return NULL;
      }
  ​
      if (intern_strings(cellvars)  0) {
          return NULL;
      }
  ​
      if (intern_string_constants(consts, NULL)  0) {
          return NULL;
      }
  ​
      ........
  ​
  }

5.2 字典的鍵

CPython 還會駐留任何字典對象的字符串鍵。

當在字典中插入元素時,解釋器會對該元素的鍵作字符串駐留。以下代碼出自dictobject.c,展示了實際的行為。

有趣的地方:在PyUnicode_InternInPlace函數(shù)被調(diào)用處有一條注釋,它問道,我們是否真的需要對所有字典中的全部鍵進行駐留?

int
  PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
  {
      PyObject *kv;
      int err;
      kv = PyUnicode_FromString(key);
      if (kv == NULL)
          return -1;
  ​
      // Invoking String Interning on the key
      PyUnicode_InternInPlace(kv); /* XXX Should we really? */
  ​
      err = PyDict_SetItem(v, kv, item);
      Py_DECREF(kv);
      return err;
  }

5.3 任何對象的屬性

Python 中對象的屬性可以通過setattr函數(shù)顯式地設置,也可以作為類成員的一部分而隱式地設置,或者在其數(shù)據(jù)類型中預定義。

CPython 會駐留所有這些屬性名,以便實現(xiàn)快速查找。以下是函數(shù)PyObject_SetAttr的代碼片段,該函數(shù)定義在文件object.c中,負責為 Python 對象設置新屬性。

int
  PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
  {
  ​
      ........
  ​
      PyUnicode_InternInPlace(name);
  ​
      ........
  }

5.4 顯式地駐留

Python 還支持通過sys模塊中的intern函數(shù)進行顯式地字符串駐留。

當使用任何字符串對象調(diào)用此函數(shù)時,該字符串對象將被駐留。以下是sysmodule.c文件的代碼片段,它展示了在sys_intern_impl函數(shù)中的字符串駐留過程。

static PyObject *
  sys_intern_impl(PyObject *module, PyObject *s)
  {
  ​
      ........
  ​
      if (PyUnicode_CheckExact(s)) {
          Py_INCREF(s);
          PyUnicode_InternInPlace(s);
          return s;
      }
  ​
      ........
  }

6、字符串駐留的其它發(fā)現(xiàn)

只有編譯期的字符串會被駐留。在解釋時或編譯時指定的字符串會被駐留,而動態(tài)創(chuàng)建的字符串則不會。

Python貓注:這一條規(guī)則值得展開思考,我曾經(jīng)在上面踩過坑……有兩個知識點,我相信 99% 的人都不知道:字符串的 join() 方法是動態(tài)創(chuàng)建字符串,因此其創(chuàng)建的字符串不會被駐留;常量折疊機制也發(fā)生在編譯期,因此有時候容易把它跟字符串駐留搞混淆。推薦閱讀《join()方法的神奇用處與Intern機制的軟肋》

包含 ASCII 字符和下劃線的字符串會被駐留。在編譯期間,當對字符串字面量進行駐留時,CPython確保僅對匹配正則表達式[a-zA-Z0-9_]*的常量進行駐留,因為它們非常貼近于 Python 的標識符。

注:關于 Python 中標識符的命名規(guī)則,在 Python2 版本只有“字母、數(shù)字和下劃線”,但在 Python 3.x 版本中,已經(jīng)支持 Unicode 編碼。這部分內(nèi)容推薦閱讀《醒醒!Python已經(jīng)支持中文變量名啦!》

以上就是詳解python字符串駐留技術的詳細內(nèi)容,更多關于python字符串駐留技術的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • python字符串的多行輸出的實例詳解
  • python列表和字符串的三種逆序遍歷操作
  • python 如何比較字符串是否一樣
  • python str()如何將參數(shù)轉(zhuǎn)換為字符串類型
  • 教你怎么用python實現(xiàn)字符串轉(zhuǎn)日期
  • 如何使用python提取字符串的中英文(正則判斷)
  • python 如何將帶小數(shù)的浮點型字符串轉(zhuǎn)換為整數(shù)
  • Python的字符串示例講解
  • python生成隨機數(shù)、隨機字符、隨機字符串的方法示例
  • python如何正確的操作字符串

標簽:黑龍江 常德 阿里 潛江 呂梁 通遼 銅川 株洲

巨人網(wǎng)絡通訊聲明:本文標題《詳解python字符串駐留技術》,本文關鍵詞  詳解,python,字符串,駐留,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解python字符串駐留技術》相關的同類信息!
  • 本頁收集關于詳解python字符串駐留技術的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    xxxxaaa欧美另类| 国产精品zjzjzj在线观看| 欧美一区二区三区四区夜夜大片| 国产精品久久久久久久免费| 国产aⅴ夜夜欢一区二区三区| 午夜羞羞小视频在线观看| 欧美理论电影在线| 国产网友自拍视频| 日日夜夜免费精品视频| 国产精品久久网| 在线观看中文字幕网站| eeuss影院www免费影院| 99精品国产一区二区青青牛奶| 日本在线中文字幕一区二区三区| 四虎影视18库在线影院| 精品欧美黑人一区二区三区| 国产精品亚洲综合在线观看| 97精品欧美一区二区三区| 精品国产一区二区三区久久久樱花| 国产天堂在线播放| 视频一区二区免费| 影音先锋男人看片资源| 久久精品99国产精| 特一级黄色大片| 美国一级片在线观看| 加勒比视频一区| 中文幕一区二区三区久久蜜桃| 日韩精品在线免费观看视频| 一级黄色大片免费看| 天堂资源在线播放| 欧美大片免费| 国产日韩精品一区二区三区| 日韩国产精品久久久久久亚洲| 大胆日韩av| 欧美交换配乱吟粗大25p| 亚洲三级免费电影| 欧美久久久久中文字幕| 国产午夜亚洲精品一级在线| 国产一区二区三区视频免费| 亚洲资源网你懂的| 久草手机视频在线观看| 亚洲大尺度美女在线| 911精品产国品一二三产区| 成人精品在线视频| 国产精品久久久久久久久免费樱桃| 99久热在线精品996热是什么| 欧美一区二区大片| 巨乳女教师的诱惑| 在线视频不卡一区二区| 自拍视频在线观看一区二区| eeuss一区二区三区| 日本韩国一区| 中文字幕亚洲影院| 亚洲第一福利专区| 亚洲qvod图片区电影| 亚洲qvod图片区电影| 国产精品探花在线播放| 国产精品一二三在线观看| www.精品在线| 久久精品盗摄| 国产高清视频免费在线观看| 中文字幕在线天堂| 国产女优在线播放| 综合区小说区图片区在线一区| 成人免费高清| 欧美激情国产精品免费| 亚洲成人一区在线| 亚洲国产精品18久久久久久| 成人免费在线看片| 欧美 日韩 中文字幕| 国产精品成人在线视频| 波多野结衣影院| 久久97精品| 久久精品夜色噜噜亚洲a∨| 天天做综合网| 国产精品色婷婷在线观看| 天天影视色综合| 欧美性猛交ⅹxxx乱大交免费| 国产一区二区在线影院| 国产欧美日韩视频在线| 成人av一区二区三区在线观看| 久久视频免费看| 男人的天堂在线视频免费观看| 欧美成人se01短视频在线看| av在线不卡免费看| 秋霞久久久久久一区二区| free性欧美69巨大| wwwxxx免费| 亚洲电影先锋| 制服丝袜日韩| 亚洲人成小说网站色在线| 日本麻豆一区二区三区视频| 国产精品作爱| 久久久999精品免费| 日本成址在线观看| 国产乱理伦片在线观看夜一区| 亚洲欧美日韩不卡| 成年人在线观看视频| 肉色欧美久久久久久久免费看| 欧美人妇做爰xxxⅹ性高电影| 亚洲精品中文字幕99999| 久久青草国产手机看片福利盒子| 18精品爽国产三级网站| 在线āv视频| 亚洲高清免费一级二级三级| 91久久偷偷做嫩草影院| 日本高清视频网站www| 色呦呦在线资源| 日本24小时在线高清视频| 天堂在线观看一卡二卡三卡四卡| 欧美精品福利视频| 国产一区二区三区乱码| 国产婷婷色综合av蜜臀av| 亚洲国产成人91精品| 国产69精品久久久久久久久久| 午夜免费日韩视频| 中文av字幕| 久久69精品久久久久久久电影好| 91丨九色丨蝌蚪丨老板| 日韩限制级电影在线观看| 午夜精品久久久久久久99热黄桃| 天天躁日日躁aaaa视频| 136福利精品导航| 国产老肥熟一区二区三区| 国产一区二区成人| 成人精品小蝌蚪| 天天操夜夜爽| 亚洲女优在线观看| 欧美另类中文字幕| 国产suv精品一区二区33| 欧美在线1区| 一区二区电影在线观看| 中文字幕一区二区三区域| 国产精品jizz在线观看老狼| 三级视频在线播放| 久久国产精品免费看| 日韩男人的天堂| 今天的高清视频免费播放成人| 亚洲小说图片视频| 亚洲国产第一| 奇米影视狠狠狠| 视频一区视频二区欧美| 久久精品一二三| 看片网址国产福利av中文字幕| xvideos亚洲| 欧美成人亚洲成人| 欧美精品一卡| 国产一区二区在线电影| 国产三级漂亮女教师| 成年午夜在线| 黄色小说综合网站| 国产h视频在线播放| 激情网站在线| 国产亚洲精品美女久久久久久久久久| 国产不卡人人| 懂色中文一区二区在线播放| 在线观看爽视频| 国产一区二区三区精品久久久| 久久久国产精品麻豆| 欧美aⅴ99久久黑人专区| 亚洲欧美日本免费| 最新av网站在线观看| 最新版天堂中文在线官网| 欧美日韩国产a| 欧美成人免费在线视频| 精品国产鲁一鲁一区二区三区| 超碰在线97观看| 真实的国产乱xxxx在线91| 大量国产精品视频| eeuss影院第1页在线| 中文在线观看av| 91久久久精品| 91精品啪aⅴ在线观看国产| 日韩一中文字幕| 88久久精品无码一区二区毛片| 日韩av一区二区三区在线观看| 超碰手机在线观看| 国产精品久久久久一区二区国产| 亚洲国产精品成人av| 日韩精品视频中文在线观看| 亚洲精品美女久久| 成人综合日日夜夜| 欧美视频观看一区| 日韩亚洲天堂| 中文字幕中文字幕| 欧美成免费一区二区视频| 999精品视频在这里| 欧美午夜一区二区三区免费大片| 好男人www社区在线视频夜恋| 91视频在线| 亚洲欧美一级二级三级| 国产精品久久久久影院日本| 一本久久a久久精品vr综合| 久操视频在线免费播放| 日本在线播放不卡| 国产精品suv一区| 亚洲波多野结衣| 日韩电影免费观看在线观看| 麻豆一区产品精品蜜桃的特点| 在线观看欧美日韩电影| 久久精品av| 欧洲成人一区二区| 成人在线免费观看| 亚洲精品国产第一综合99久久| 欧美亚洲一区| 欧美另类极品videosbest视频| 亚洲欧美一区二区三区国产精品| 杨幂毛片午夜性生毛片| 一区二区日韩欧美| 日本精品一区在线| 男操女在线观看| 亚洲最大成人av| 久久久久久久久免费视频| 国产精品久久二区二区| 免费网站观看www在线观| 992tv成人免费影院| 中文字幕人妻一区二区| 九色porny丨首页在线| 久久久久久久久久久亚洲| 超碰在线网址| 欧美日韩精品一区二区三区视频| 国产又大又黄又粗又爽| 亚洲欧美日韩成人网| 亚洲精品乱码视频| 欧美日韩视频免费看| 国产熟女一区二区三区五月婷| 顶级欧美妇高清xxxxx| 91小视频网站| 欧美黄免费看| 国产精品免费看久久久香蕉| 精品在线播放午夜| **孕交吃奶水一级毛片| 国产精品偷伦一区二区| 91青娱乐在线视频| 狠狠人妻久久久久久综合蜜桃| 中文字幕一区二区三区四区五区人| www日本高清| 三级福利片在线观看| 黄色一级视频片| 日韩高清电影一区| 99蜜桃在线观看免费视频网站| av片在线观看永久免费| 亚洲人妖在线| 人妻大战黑人白浆狂泄| 污污软件在线观看| 国产喂奶挤奶一区二区三区| 色狠狠av一区二区三区| 亚洲制服丝袜在线播放| 国产乱国产乱老熟300| 国产中文字幕在线播放| 国产三级三级在线观看| 四虎4hu永久免费入口| 超碰个人在线| 国产精品久久久久久亚洲影视| 51蜜桃传媒精品一区二区| 成人激情视频免费在线| 可以免费观看av的网站| 免费在线黄色电影| 在线播放欧美女士性生活| 亚洲av人无码激艳猛片服务器| 日日摸夜夜添一区| 午夜精品久久久久久久蜜桃| 日本欧美黄色片| 色偷偷福利视频| 五月天婷婷亚洲| 久久91av| 污污网站在线观看| 亚洲国产精品大全| 夜夜精品浪潮av一区二区三区| 亚洲精品视频三区| 国产欧美一区二区三区在线观看视频| 中文字幕欧美在线观看| 欧美精品激情blacked18| 图片区小说区亚洲| 欧美日韩国产在线观看网站| 亚洲国产一区二区视频| 波多野结衣小视频| 久久午夜免费视频| 四虎一区二区三区| 一区二区三区区四区播放视频在线观看| 91精品啪aⅴ在线观看国产| 国产91高潮流白浆在线麻豆| 波波电影院一区二区三区| 奇米影视四色在观看线| 国产成人禁片在线观看| 北条麻妃在线视频观看| 免费在线观看的电影网站| 亚洲成人激情在线| 黄色av网站在线| 久久av在线看| 国产免费一区二区三区在线能观看| 日本精品一区二区三区不卡无字幕| 国产精品视频xxx| 丰满人妻一区二区三区无码av| 中文字幕视频一区二区在线有码| 欧美另类交人妖| 日韩偷拍一区二区| 一级片视频网站| 欧美日韩日日骚| 亚洲午夜av电影| 成人在线免费在线观看| 欧美福利第一页| mm视频在线视频| 色综合天天狠狠| av男人天堂av| 中文字幕在线第一页| 被灌满精子的波多野结衣| 欧美日韩加勒比精品一区| 亚洲久久久久久久久久久| 久久网中文字幕| 成年人视频在线看| 七七久久电影网| 91官网在线观看| 最新日本中文字幕| 国产午夜精品理论片a级探花| 手机视频在线观看| 欧美手机视频| 91精品国产91久久久久久黑人| 99精品中文字幕在线不卡| 精品国产乱子伦| h视频在线免费看| av在线免费观看网址| 久久理论片午夜琪琪电影网| 亚洲色图官网| 盗摄牛牛av影视一区二区| 欧美日韩破处| 国产盗摄一区二区三区| 51精品免费网站|