這篇文章主要介紹“Python疑難問題之[]與list()哪個快”,在日常操作中,相信很多人在Python疑難問題之[]與list()哪個快問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python疑難問題之[]與list()哪個快”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
成都創(chuàng)新互聯(lián)公司致力于成都網(wǎng)站設計、成都網(wǎng)站制作,成都網(wǎng)站設計,集團網(wǎng)站建設等服務標準化,推過標準化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務水平進行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇成都創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設服務!
1. [] 是 list() 的三倍快
對于第一個問題,使用timeit模塊的 timeit() 函數(shù)就能簡單地測算出來:
>>> import timeit >>> timeit.timeit('[]', number=10**7) >>> timeit.timeit('list()', number=10**7)
如上圖所示,在各自調(diào)用一千萬次的情況下,[] 創(chuàng)建方式只花費了 0.47 秒,而 list() 創(chuàng)建方式要花費 1.75 秒,所以,后者的耗時是前者的 3.7 倍!
這就回答了剛才的問題:創(chuàng)建空列表時,[] 要比 list() 快不少。
注:timeit() 函數(shù)的效率跟運行環(huán)境相關,每次執(zhí)行結(jié)果會有微小差異。我在 Python3.8 版本實驗了幾次,總體上 [] 速度是 list() 的 3 倍多一點。
2. list() 比 [] 執(zhí)行步驟多
那么,我們繼續(xù)來分析一下第二個問題:為什么 [] 會更快呢?
這一次我們可以使用dis模塊的 dis() 函數(shù),看看兩者執(zhí)行的字節(jié)碼有何差別:
>>> from dis import dis >>> dis("[]") >>> dis("list()")
如上圖所示,[] 的字節(jié)碼有兩條指令(BUILD_LIST 與 RETURN_VALUE),而 list() 的字節(jié)碼有三條指令(LOAD_NAME、CALL_FUNCTION 與 RETURN_VALUE)。
這些指令意味著什么呢?該如何理解呢?
首先,對于 [],它是 Python 中的一組字面量(literal),像數(shù)字之類的字面量一樣,表示確切的固定值。
也就是說,Python 在解析到它時,就知道它要表示一個列表,因此會直接調(diào)用解釋器中構(gòu)建列表的方法(對應BUILD_LIST),來創(chuàng)建列表,所以是一步到位。
而對于 list(),“l(fā)ist”只是一個普通的名稱,并不是字面量,也就是說解釋器一開始并不認識它。
因此,解釋器的第一步是要找到這個名稱(對應LOAD_NAME)。它會按照一定的順序,在各個作用域中逐一查找(局部作用域--全局作用域--內(nèi)置作用域),直到找到為止,找不到則拋出NameError。
解釋器看到“l(fā)ist”之后是一對圓括號,因此第二步是把這個名稱當作可調(diào)用對象來調(diào)用,即把它當成一個函數(shù)進行調(diào)用(對應 CALL_FUNCTION)。
因此,list() 在創(chuàng)建列表時,需要經(jīng)過名稱查找與函數(shù)調(diào)用兩個步驟,才能真正開始創(chuàng)建列表(注:CALL_FUNCTION 在底層還會有一些函數(shù)調(diào)用過程,才能走到跟 BUILD_LIST 相通的邏輯,此處我們忽略不計)。
至此,我們就可以回答前面的問題了:因為 list() 涉及的執(zhí)行步驟更多,因此它比 [] 要慢一些。
3. list() 的速度提升
看完前兩個問題的解答過程,你也許覺得還不夠過癮,而且可能覺得就算知道了這個冷知識,也不會有多大的幫助,似乎那微弱的提升顯得微不足道。
由于有發(fā)散性思考的習慣,我還想到了另外一個挺有意思的問題:list() 的速度能否提升呢?
在剛剛發(fā)布的 Python 3.9.0 版本中,它給 list() 實現(xiàn)了更快的 vectorcall 協(xié)議,因此執(zhí)行速度會有一定的提升。
到此,關于“Python疑難問題之[]與list()哪個快”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
分享文章:Python疑難問題之[]與list()哪個快
網(wǎng)站地址:http://weahome.cn/article/pieios.html