国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

從 Python 源碼來分析列表的 Resize 機制

開發 后端
Python 列表底層是通過存儲對象指針的變長數組來實現的,使用數組帶來的好處就是可以通過索引隨機訪問列表中的元素。

[[387994]]

“ resize 是增加列表開銷的重要因素。”

Python 列表底層是通過存儲對象指針的變長數組來實現的,使用數組帶來的好處就是可以通過索引隨機訪問列表中的元素。

然而,由于 list 屬于可變數據類型,我們可以動態地在 list 中增減元素,當底層數組不足以容納新元素時,就要調整其大小了。這正是“變長”的含義所在。

那么,list 使用的變長數組是如何調整其大小呢?我們通過閱讀 Python 源碼來做下簡單分析。

【列表初始內存分配機制】

先來了解一下,創建一個 list 時,list 底層數組是什么樣子的。

list___init__() 是創建 list 對象的接口函數。它調用了 list___init___impl(self, iterable)。list___init___impl 接受一個 iterable 作為初始化源。這和我們通常初始化一個 list 對象的方式是一致的。

list___init___impl 做了哪些初始化工作呢?

list___init___impl() 首先將入參 self 指向的對象清空,原因是:Python 為提升創建 list 對象的效率,維護了一個 free_list 對象池。它可以回收不再使用的 list 對象,并重新分配給新 list 對象使用。

  1. /* Empty list reuse scheme to save calls to malloc and free */ 
  2. #ifndef PyList_MAXFREELIST 
  3. #  define PyList_MAXFREELIST 80 
  4. #endif 
  5.  
  6. static PyListObject *free_list[PyList_MAXFREELIST]; 
  7. static int numfree = 0; 

這個 list 內存池的大小為 80.

如果 self 指向的是一個緩存池中的對象,則需要先將它清理干凈。

然后,list___init___impl() 調用 list_preallocate_exact() 為 self 的變長數組分配一塊內存,這個數組中元素的個數和 iterable 中元素的個數相同。

這樣,list 對象使用的變長數組就創建好了。

【列表 resize 的實現算法】

那么,變長數組是使用什么算法來調整其大小呢?

這個邏輯是在 list_resize() 函數中實現的。先看代碼。

  1. static int 
  2. list_resize(PyListObject *self, Py_ssize_t newsize) 
  3.     PyObject **items; 
  4.     size_t new_allocated, num_allocated_bytes; 
  5.     Py_ssize_t allocated = self->allocated; 
  6.  
  7.     /*Step 1*/ 
  8.     if (allocated >= newsize && newsize >= (allocated >> 1)) { 
  9.         assert(self->ob_item != NULL || newsize == 0); 
  10.         Py_SET_SIZE(self, newsize); 
  11.         return 0; 
  12.     } 
  13.  
  14.     /*Step 2*/ 
  15.     new_allocated = ((size_t)newsize + (newsize >> 3) + 6) & ~(size_t)3; 
  16.     /* Do not overallocate if the new size is closer to overalocated size 
  17.      * than to the old size
  18.      */ 
  19.     if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize)) 
  20.         new_allocated = ((size_t)newsize + 3) & ~(size_t)3; 
  21.  
  22.     if (newsize == 0) 
  23.         new_allocated = 0; 
  24.          
  25.     /*Step 3*/ 
  26.     num_allocated_bytes = new_allocated * sizeof(PyObject *); 
  27.     items = (PyObject **)PyMem_Realloc(self->ob_item, num_allocated_bytes); 
  28.     if (items == NULL) { 
  29.         PyErr_NoMemory(); 
  30.         return -1; 
  31.     } 
  32.      
  33.     /*Step 4*/ 
  34.     self->ob_item = items; 
  35.     Py_SET_SIZE(self, newsize); 
  36.     self->allocated = new_allocated; 
  37.     return 0; 

list_resize() 的處理邏輯為:

  1. 先判斷原 list 對象已分配的空間是否滿足新需求:大于 newsize,且不超過 newsize 的兩倍(超過 newsize 兩倍時,需要縮短已分配空間)。滿足,則無需再調整。
  2. 計算新數組的需要容納的元素的數目:new_allocated。這個算法有點難理解:它會額外分配一些內存,并將這塊內存以 4 的倍數進行對齊。可以不用去細究為什么要這樣計算。
  3. 計算需要重新分配的內存大小:num_allocated_bytes。
  4. 調用 PyMem_Realloc() 分配內存。

更新 self 指向對象的相關屬性:調整變長數組指針的指向,設置 list 中元素的個數,設置已分配空間的大小。

【哪些操作會導致列表 resize?】

我們已經了解了 resize 的執行邏輯。那么 list 會在什么情況下 resize 底層數組呢?

  • 數組內存不夠用的時候

insert、append、extend、切片賦值,這些操作都有可能需要分配更多的內存。

  • 數組內存冗余的時候

pop、remove 可能需要縮減數組的空間,避免浪費。

看起來,凡是修改 list 元素數目的操作都有可能導致 resize 的發生。這些操作函數(定義在 listobject.c 中)確實也全部調用了 list_resize() 函數。

根據上邊的 resize 算法,如果你的 list 中的元素數目抖動很大,發生 resize 的概率就大很多。

 

因此,我們在開發中應盡量避免頻繁大幅度增減 list 元素的情況,以提升程序的運行效率。

本文轉載自微信公眾號「python學與思」,可以通過以下二維碼關注。轉載本文請聯系python學與思公眾號。  

 

責任編輯:武曉燕 來源: python學與思
相關推薦

2021-11-11 17:40:08

WatchdogAndroid源碼分析

2020-11-20 07:51:02

JavaSPI機制

2022-02-07 21:49:06

瀏覽器渲染chromium

2017-01-12 15:42:53

HookPythonImport

2021-03-26 22:23:13

Python算法底層

2012-05-31 02:54:07

HadoopJava

2017-02-09 15:15:54

Chrome瀏覽器

2025-03-31 00:00:00

MCPAPI服務器通信

2020-12-14 08:03:52

ArrayList面試源碼

2020-12-17 08:03:57

LinkedList面試源碼

2024-08-30 10:40:12

2023-08-28 07:49:24

Redisson鎖機制源碼

2021-12-06 14:52:08

動畫Android補間動畫

2011-06-23 13:10:39

Python 對象機制

2020-05-26 18:50:46

JVMAttachJava

2023-06-15 14:09:00

解析器Servlet容器

2025-06-16 04:00:00

2024-09-06 09:37:45

WebApp類加載器Web 應用

2021-05-27 13:37:24

開發技能React

2021-09-10 00:34:22

Java 線程啟動
點贊
收藏

51CTO技術棧公眾號

九九热精品视频国产| 99c视频在线| 成人免费高清在线播放| 久久综合国产精品| 一级二级三级欧美| 精品福利av| 亚洲综合大片69999| 蜜桃一区二区| 88xx成人精品| 成人h动漫精品一区二区器材| 亚洲天堂男人天堂女人天堂| 三级福利片在线观看| 日韩欧美高清在线| 污污在线观看| 欧美一区二区三区播放老司机| 久草在线青青草| 日本大香伊一区二区三区| 超级碰碰视频| 一区二区三区毛片| 8×8x拔擦拔擦在线视频网站| 粉嫩av一区| 一区二区三区视频在线观看| www.99re.av| 亚洲人成影院在线观看| 浪潮av在线| 色综合天天性综合| 久久日韩视频| 精品中文字幕久久久久久| 在线最新版中文在线| 中文字幕亚洲一区二区三区五十路 | 白白色在线观看| 欧美一区二区三区四区五区| 国产99re66在线视频| 日韩av资源在线播放| 国产综合色区在线观看| 超薄丝袜一区二区| 欧美猛男男男激情videos| 成人啪啪免费看| 一区二区三区福利| 色中文字幕在线观看| www国产精品av| 九色福利视频| 亚洲影院一区| 日本一区二区久久精品| 久久成人综合网| 成人在线观看a| 亚洲夂夂婷婷色拍ww47| 国产三级视频在线| 日韩www在线| 国产精品网在线观看| 91精品婷婷国产综合久久蝌蚪| 日韩和欧美一区二区| 欧美极品欧美精品欧美| 亚洲第一福利一区| 男女在线观看视频| 欧美激情小视频| 在线成人av| 久久精品xxx| 亚洲图片一区二区| 国产一线二线在线观看| 97精品在线观看| 亚洲午夜黄色| 成年网站在线免费观看| 欧美视频第一页| 在线天堂资源| 国产美女精品免费电影| 激情综合一区二区三区| 欧美r片在线| 亚洲午夜未删减在线观看 | 偷窥自拍亚洲色图| 这里只有精品电影| 精品国产午夜肉伦伦影院| 精品久久久久久一区二区里番| 9色porny自拍视频一区二区| 传媒在线观看| 亚洲性日韩精品一区二区| 日韩精品dvd| 成人精品视频在线播放| 午夜不卡在线视频| 日本美女久久| 国产精品一区二区你懂得| 91免费看片在线观看| www免费视频观看在线| 欧美性视频精品| 国产精品一区二区久久精品爱涩 | 久久久www免费人成黑人精品| 日本一区二区在线不卡| 手机在线免费看av| 国产欧美韩国高清| 久久婷婷色综合| 国内精彩免费自拍视频在线观看网址| 国产欧美久久一区二区| 久久色.com| 色多多在线观看| 国产精品theporn88| 国产精品久久久久久久久免费相片| 欧美videosex性极品hd| 91精品久久久久久久久久久久久| 国产日韩精品一区| 欧美黑人粗大| 日本一区视频在线观看免费| 欧美午夜影院在线视频| 蜜桃一区二区三区| 99热播在线观看| 久久久久久久久一| 免费在线中文字幕| 91精品国产综合久久男男| 国产精品欧美一区喷水| 中文字幕av不卡在线| 日韩精品欧美激情| 久久不射2019中文字幕| 国产永久免费高清在线观看| 国产精品久久久久久久7电影| 久久婷婷久久一区二区三区| 免费观看成人性生生活片| 亚洲精品视频一二三| 欧美一区二区三区四区在线观看 | 国产成人午夜视频网址| 成人免费福利片| 国产va在线视频| 视频一区二区在线观看| 欧美一级欧美三级| 一本色道久久综合亚洲精品不卡 | 色偷偷久久人人79超碰人人澡| 国产欧美日韩视频在线| sm一区二区三区| 亚洲成人免费视频| 麻豆国产精品| 国产福利一区视频| 久热爱精品视频线路一| 成人免费的视频| 久久久久毛片| 黄色影院一级片| 久久综合九色九九| 国产日韩三级在线| 牛牛影视久久网| 国外亚洲成av人片在线观看| 国产脚交av在线一区二区| 亚洲欧美偷拍三级| 日韩av有码| 久草视频在线看| 99国产盗摄| 欧美猛男男办公室激情| 亚洲欧美日韩国产一区| av在线播放资源| 午夜啪啪福利视频| 亚洲一区二区精品| 国产亚洲欧洲一区高清在线观看| 狠狠久久伊人| 亚洲激情文学| 青娱乐国产91| 亚洲性生活视频| 亚洲国产精品高清| 清纯唯美亚洲综合一区| 久久免费看视频| 欧美亚洲丝袜| 日韩专区中文字幕| 亚洲免费高清视频在线| 亚洲性感美女99在线| 国产三级伦理在线| 久久久免费视频网站| 国产精品第一页在线| 欧美视频一区在线观看| 精品一区二区久久| 日韩精品一级| 欧美成人免费| 中文字幕一区二区三区5566| 欧美大秀在线观看| 色综合久久久久综合| 美腿丝袜亚洲色图| 久草在线综合| 国产精品视频一区二区久久| 亚洲国产一区二区精品视频| 精品综合久久久久久97| 精品久久久精品| 国产在线一区二区| 国产成人av| 9lporm自拍视频区在线| 污网站在线观看免费| 久久亚洲国产精品日日av夜夜| 在线视频精品一| 黄色精品在线看| 国产精品一区二区久激情瑜伽| 免费毛片在线不卡| 牛牛精品视频在线| 被下部羞羞漫画| 视频一区三区| 国产精品久久久久福利| 国产视频久久网| 天天爽夜夜爽夜夜爽精品视频| 丝袜美腿高跟呻吟高潮一区| 国产欧美一区二区三区米奇| 丝袜中文在线| 男人的天堂www| eeuss中文| 97久久天天综合色天天综合色hd| 中文字幕欧美日韩| 欧美日韩在线观看一区二区 | 欧美大黑帍在线播放| 亚洲一区二区三区四区视频|