Python中[]與list()哪個快-創(chuàng)新互聯(lián)

這篇文章主要介紹了Python中[]與list()哪個快,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)長期為1000多家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為興化企業(yè)提供專業(yè)的做網站、成都網站設計興化網站改版等技術服務。擁有十年豐富建站經驗和眾多成功案例,為您定制開發(fā)。

在日常使用 Python 時,我們經常需要創(chuàng)建一個列表,相信大家都很熟練了吧?

# 方法一:使用成對的方括號語法list_a = []# 方法二:使用內置的 list()list_b = list()復制代碼

上面的兩種寫法,你經常使用哪一個呢?是否思考過它們的區(qū)別呢?

讓我們開門見山,直接拋出本文的問題吧:兩種創(chuàng)建列表的 [] 與 list() 寫法,哪一個更快呢,為什么它會更快呢?

注:為了簡化問題,我們以創(chuàng)建空列表為例進行分析。關于列表的更多介紹與用法說明,可以查看這篇文章

1、 [] 是 list() 的三倍快

對于第一個問題,使用timeit模塊的 timeit() 函數(shù)就能簡單地測算出來:

>>> import timeit>>> timeit.timeit('[]', number=10**7)>>> timeit.timeit('list()', number=10**7)復制代碼

Python中[]與list()哪個快

如上圖所示,在各自調用一千萬次的情況下,[] 創(chuàng)建方式只花費了 0.47 秒,而 list() 創(chuàng)建方式要花費 1.75 秒,所以,后者的耗時是前者的 3.7 倍!

這就回答了剛才的問題:創(chuàng)建空列表時,[] 要比 list() 快不少。

注:timeit() 函數(shù)的效率跟運行環(huán)境相關,每次執(zhí)行結果會有微小差異。我在 Python3.8 版本實驗了幾次,總體上 [] 速度是 list() 的 3 倍多一點。

2、list() 比 [] 執(zhí)行步驟多

那么,我們繼續(xù)來分析一下第二個問題:為什么 [] 會更快呢?

這一次我們可以使用dis模塊的 dis() 函數(shù),看看兩者執(zhí)行的字節(jié)碼有何差別:

>>> from dis import dis>>> dis("[]")>>> dis("list()")復制代碼

Python中[]與list()哪個快

如上圖所示,[] 的字節(jié)碼有兩條指令(BUILD_LIST 與 RETURN_VALUE),而 list() 的字節(jié)碼有三條指令(LOAD_NAME、CALL_FUNCTION 與 RETURN_VALUE)。

這些指令意味著什么呢?該如何理解它們呢?

首先,對于 [],它是 Python 中的一組字面量(literal),像數(shù)字之類的字面量一樣,表示確切的固定值。

也就是說,Python 在解析到它時,就知道它要表示一個列表,因此會直接調用解釋器中構建列表的方法(對應 BUILD_LIST ),來創(chuàng)建列表,所以是一步到位。

而對于 list(),“l(fā)ist”只是一個普通的名稱,并不是字面量,也就是說解釋器一開始并不認識它。

因此,解釋器的第一步是要找到這個名稱(對應 LOAD_NAME)。它會按照一定的順序,在各個作用域中逐一查找(局部作用域--全局作用域--內置作用域),直到找到為止,找不到則會拋出NameError。

解釋器看到“l(fā)ist”之后是一對圓括號,因此第二步是把這個名稱當作可調用對象來調用,即把它當成一個函數(shù)進行調用(對應 CALL_FUNCTION)。

因此,list() 在創(chuàng)建列表時,需要經過名稱查找與函數(shù)調用兩個步驟,才能真正開始創(chuàng)建列表(注:CALL_FUNCTION 在底層還會有一些函數(shù)調用過程,才能走到跟 BUILD_LIST 相通的邏輯,此處我們忽略不計)。

至此,我們就可以回答前面的問題了:因為 list() 涉及的執(zhí)行步驟更多,因此它比 [] 要慢一些。

3、list() 的速度提升

看完前兩個問題的解答過程,你也許覺得還不夠過癮,而且可能覺得就算知道了這個冷知識,也不會有多大的幫助,似乎那微弱的提升顯得微不足道。

但是,我們Python貓出品的《Python為什么》系列一直秉承著孜孜不倦的求知精神,是不可能放著這個問題不去回答的。

而且,由于有發(fā)散性思考的習慣,我還想到了另外一個挺有意思的問題:list() 的速度能否提升呢?

我不久前寫過一篇文章 正好討論到這個問題,也就是在剛剛發(fā)布的 Python 3.9.0 版本中,它給 list() 實現(xiàn)了更快的 vectorcall 協(xié)議,因此執(zhí)行速度會有一定的提升。

Python中[]與list()哪個快

感興趣的同學可以去 Python 官網下載 3.9 版本。

根據(jù)我多輪的測試結果,在新版本中運行 list() 一千萬次,耗時大概在 1 秒左右,也就是 [] 運行耗時的 2 倍,相比于前面接近 4 倍的數(shù)據(jù),當前版本總體上是提升了不少。

感謝你能夠認真閱讀完這篇文章,希望小編分享Python中[]與list()哪個快內容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)-成都網站建設公司行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細的解決方法等著你來學習!

分享文章:Python中[]與list()哪個快-創(chuàng)新互聯(lián)
URL分享:http://muchs.cn/article2/cedgic.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、虛擬主機、定制網站、服務器托管、網站排名、關鍵詞優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站優(yōu)化排名