中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python疑難問題之[]與list()哪個快

發布時間:2021-10-26 13:59:47 來源:億速云 閱讀:167 作者:iii 欄目:編程語言

這篇文章主要介紹“Python疑難問題之[]與list()哪個快”,在日常操作中,相信很多人在Python疑難問題之[]與list()哪個快問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python疑難問題之[]與list()哪個快”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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

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

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

Python疑難問題之[]與list()哪個快

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

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

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

2. list() 比 [] 執行步驟多

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

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

>>> from dis import dis >>> dis("[]") >>> dis("list()")

Python疑難問題之[]與list()哪個快

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

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

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

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

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

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

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

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

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

3. list()  的速度提升

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

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

在剛剛發布的 Python 3.9.0 版本中,它給 list() 實現了更快的 vectorcall  協議,因此執行速度會有一定的提升。

到此,關于“Python疑難問題之[]與list()哪個快”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南丹县| 上虞市| 肥东县| 平遥县| 长治县| 阿巴嘎旗| 峨眉山市| 镇坪县| 泗水县| 阿城市| 濮阳市| 葫芦岛市| 定日县| 牟定县| 宁海县| 昌黎县| 抚顺县| 同德县| 花莲市| 晋江市| 蕲春县| 日土县| 永平县| 曲水县| 岗巴县| 张北县| 库车县| 改则县| 志丹县| 张家界市| 工布江达县| 忻州市| 屏东市| 永善县| 浠水县| 绵阳市| 兰西县| 同德县| 合江县| 丰台区| 中山市|