python列表底層原理

Python 列表(list)是 Python 中非常常用的數據結構之一。它們的底層實現基于動態數組,具體來說,是一個可以動態調整大小的數組。這使得列表在操作和使用上非常靈活。以下是 Python 列表底層實現的主要原理:

動態數組

Python 列表是通過動態數組實現的,這意味著列表在需要時可以自動調整其大小。初始分配一個固定大小的數組,當元素數量超過當前容量時,會分配一個更大的新數組,并將舊數組的元素復制到新數組中。

動態調整大小

當列表需要擴展時,Python 不只是簡單地增加一個新元素,而是通常會按一定比例擴展列表的容量。常見的增長策略是將當前容量擴大為原來的 1.125 倍到 2 倍之間(具體策略取決于 Python 的實現版本)。這避免了每次添加新元素時都需要重新分配和復制數組,從而提高了性能。

內存分配策略

Python 使用分配器管理內存,以減少因頻繁分配和釋放內存導致的碎片化。當需要擴展列表容量時,會預先分配更多的空間,以容納未來可能添加的元素。這種策略被稱為“緩沖增長”,在減少內存操作次數的同時,提供了較好的性能。

時間復雜度

  • 索引和更新操作:由于列表底層是數組,這些操作的時間復雜度為 (O(1))。
  • 添加元素:如果沒有達到當前容量,添加操作(append)的時間復雜度為 (O(1))。如果需要擴展容量,時間復雜度為攤銷的 (O(1))。
  • 刪除元素:刪除操作(pop)的時間復雜度為 (O(1)),如果刪除的是最后一個元素。如果是刪除中間元素,則時間復雜度為 (O(n)),因為需要移動后續元素。

優缺點

  • 優點
    • 支持隨機訪問,時間復雜度為 (O(1))。
    • 動態調整大小,使用方便。
  • 缺點
    • 由于需要預留額外空間,可能會浪費一些內存。
    • 在需要頻繁擴展容量時,會有一定的性能開銷。

其他特性

  • 異質性:列表可以存儲不同類型的對象。
  • 嵌套:列表可以包含其他列表(嵌套列表)。
  • 切片:支持切片操作,可以方便地訪問部分列表。

實現細節

在 CPython 實現中,列表的底層結構如下所示:

typedef struct {PyObject_VAR_HEADPyObject **ob_item;Py_ssize_t allocated;
} PyListObject;
  • ob_item 是一個指向元素數組的指針。
  • allocated 表示已分配的數組容量。

總結起來,Python 列表的底層實現基于動態數組,結合了高效的隨機訪問和動態擴展的優點,但也帶來了內存管理和擴展時的性能開銷。了解這些細節可以幫助我們在使用列表時做出更優化的選擇。

數據結構時間復雜度是什么

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14654.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IT廉連看——UniApp——事件綁定

IT廉連看——UniApp——事件綁定 這是我們上節課最終的樣式; 一、現在我有這樣一個需求,當我點擊“生在國旗下,長在春風里”它的顏色由紅色變為藍色,該怎么操作? 這時候我們需要一個事件的綁定,綁定一個單…

使用 Docker 部署 Jenkins 并設置初始管理員密碼

使用 Docker 部署 Jenkins 并設置初始管理員密碼 每一次開始,我都特別的認真與膽怯,是因為我期待結局,也能夠不會那么粗糙,不會讓我失望,所以,就多了些思考,多了些拘束,所以&#xf…

【HCIP學習】STP協議

一、STP協議出現背景(Spanning Tree Protocol,生成樹協議) 二層環路帶來的問題:廣播風暴; MAC地址表的震蕩; 二、STP定義 stp是二層網絡中用于消除環路的協議,通過阻斷冗余鏈路來消除&#xff…

Flutter 中的 Hero 小部件:全面指南

Flutter 中的 Hero 小部件:全面指南 在 Flutter 中,Hero 動畫是一種流行的動畫效果,用于在不同路由(頁面)之間傳遞小部件,從而創建平滑的共享元素過渡效果。這種動畫可以增強用戶的視覺體驗,使…

加速度傳感器的沖擊振動的原始特征與解算(部分)

這里是工作中測得的一組數據,設備有多個加速度傳感器通道,我們可以看到沖擊振動發生前后,各個振動傳感器的的反饋以及其他的細化特征: 1.隨機振動(加速度傳感器視角) 2.沖擊振動(加速度&#x…

Android Settings系統屬性讀寫

Settings系統屬性存儲均為xml,分三種: 1.global:所有的偏好設置對系統的所有用戶公開,第三方APP有讀沒有寫的權限; 源碼地址:frameworks/base/core/java/android/provider/Settings.java 對應xml路徑&…

C++ 網絡編程

一、Reactor 網絡編程模型 reactor 是一個事件處理模型。網絡處理:因為用戶層并不知道 IO 什么時候就緒,所以將對 IO 的處理轉化為對事件的處理。網絡模型構成: 非阻塞 IO:操作 IO,如果 IO 未就緒,IO 函數會立刻返回。IO 多路復用:檢測多路 IO 是否就緒。工作流程: 注冊…

【從零開始實現stm32無刷電機FOC】【理論】【1/6 電機旋轉本質】

目錄 電機旋轉需要什么樣的力?怎么產生力矢量?怎么產生任意的線圈磁矢量? 電機旋轉需要什么樣的力? 電機切向存在受力,電機就會旋轉。 進一步查看電機結構,分為轉子和定子,大部分情況下&#…

Spark的概述、核心、組成、運行模式

一、Spark概述 Apache Spark 是一個快速的, 多用途的集群計算系統, 相對于 Hadoop MapReduce 將中間結果保存在磁盤中, Spark 使用了內存保存中間結果, 能在數據尚未寫入硬盤時在內存中進行運算。Spark 是一個計算框架,可以用來代替Hadoop中的MapReduce計算框架。 二…

FIFO-Diffusion,一個無需額外訓練即可生成長視頻的框架。通過確保每個幀引用足夠多的先前幀來生成高質量、一致的長視頻。

簡單來講,FIFO-Diffusion先通過一些模型如VideoCraft2、zeroscope、Opem-Sora Plan等與FIFO-Diffusion的組合生成短視頻,然后取結尾的幀(也可以取多幀),再用這一幀的圖片生成另一段短視頻,然后拼接起來。FI…

【MySQL精通之路】存儲引擎-MySQL8.0中的差異

存儲引擎是MySQL組件,用于處理不同表類型的SQL操作。 InnoDB是默認的、最通用的存儲引擎,Oracle默認使用其創建表。(MySQL 8.0中的CREATE TABLE語句默認創建InnoDB表。) MySQL Server使用可插拔存儲引擎體系結構,使存儲…

linux命令日常使用思考

linux命令日常使用思考 復制的相關問題scp和cp的區別root192.168.5.229-r的理解 更新版本的相關問題svn info 根目錄和家目錄的區別根目錄家目錄 復制的相關問題 scp和cp的區別 安全性:SCP 是基于 SSH 的加密傳輸協議,可以保證數據在傳輸過程中的安全性…

vue期末復習選擇題1

1. 下面哪一項描述是錯誤的?(B) A.$("ul li:gt(5):not(:last)")選取ul標記里面索引值大于5且不是最后一個的li元素B.$("div").find("span")選取div元素的子元素spanC.$("div.showmore > a")選取…

Axure RP 9 for Mac/win:重新定義交互原型設計的未來

在當今數字化時代,交互原型設計已成為產品開發中不可或缺的一環。Axure RP 9作為一款功能強大的交互原型設計軟件,憑借其出色的性能和用戶友好的界面,贏得了廣大設計師的青睞。 Axure RP 9不僅支持Mac和Windows兩大主流操作系統,…

Excel實現將A列和B列的內容組合到一個新的列(例如C列)中,其中A列的每個值都與B列的所有值組合。

利用Excel中vba代碼宏實現 原始數據: 自動生成后數據: vba實現代碼: Sub CombineColumns()Dim ws As WorksheetDim lastRowA As Long, lastRowB As Long, i As Long, j As LongDim MyIndex As IntegerDim strCombine As String, strColA As…

主流容器工具對比以及重點推薦學習的企業級工具

常見的主流容器工具包括但不限于以下幾種: 1. Docker: Docker 是最流行的容器平臺之一,它允許開發者將應用及其依賴打包到一個輕量級、可移植的容器中,然后可以在任何支持Docker的系統上運行。 2. Kubernetes:Kubern…

【Python】 去除字符串中的所有空白字符

基本原理 在Python中,字符串(String)是不可變的數據類型,這意味著一旦創建了一個字符串,就不能修改它的內容。然而,我們可以創建一個新的字符串,它包含原始字符串中的字符,但不包含…

局域網傳文件怎么操作?輕松實現文件共享!

在現代的辦公和生活中,局域網傳文件已經成為一種非常常見和方便的方式,可以快速、安全地在局域網內進行文件傳輸。無需依賴互聯網,局域網傳文件可以幫助團隊成員之間共享文件、備份數據、進行協作等。本文將介紹三種常見的方法,幫…

MySQL——存儲過程,觸發器

BaiduComate: # 問題1: # 問題1: 幫我創建兩個表student與score表,要求student表有id,createDate,userName,phone,age,sex,introduce, 要求score表有id&…

Vue3實戰Easy云盤(四):使用空間+文件預覽+文件分享+文件下載

一、空間使用 Framework.vue中 (1)引入接口 const api {getUseSpace: "/getUseSpace",logout: "/logout", }; (2)回調 // 使用空間 const useSpaceInfo ref({ useSpace: 0, totalSpace: 1 }); const g…