Python 疑難問題:[] 與 list() 哪個快?
# 方法一:使用成對的方括號語法
list_a = []
# 方法二:使用內建的 list()
list_b = list()
複製程式碼
上面的兩種寫法,你經常使用哪一個呢?是否思考過它們的區別呢?
讓我們開門見山,直接丟擲本文的問題吧:兩種建立列表的 [] 與 list() 寫法,哪一個更快呢,為什麼它會更快呢?
注:為了簡化問題,我們以建立空列表為例進行分析。關於列表的更多介紹與用法說明,可以檢視這篇文章
1、 [] 是 list() 的三倍快
對於第一個問題,使用timeit
模組的 timeit() 函式就能簡單地測算出來:
>>> import timeit
>>> timeit.timeit('[]', number=10**7)
>>> timeit.timeit('list()', number=10**7)
複製程式碼
如上圖所示,在各自呼叫一千萬次的情況下,[] 建立方式只花費了 0.47 秒,而 list() 建立方式要花費 1.75 秒,所以,後者的耗時是前者的 3.7 倍!
這就回答了剛才的問題:建立空列表時,[] 要比 list() 快不少。
注:timeit() 函式的效率跟執行環境相關,每次執行結果會有微小差異。我在 Python3.8 版本實驗了幾次,總體上 [] 速度是 list() 的 3 倍多一點。
2、list() 比 [] 執行步驟多
那麼,我們繼續來分析一下第二個問題:為什麼 [] 會更快呢?
這一次我們可以使用dis
模組的 dis() 函式,看看兩者執行的位元組碼有何差別:
>>> from dis import dis
>>> dis("[]")
>>> dis("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() 涉及的執行步驟更多,因此它比 [] 要慢一些。
相關文章
- 面試疑難問題面試
- java與python哪個執行快?JavaPython
- 通透,23 個問題 TCP 疑難雜症全解析TCP
- 工作疑難問題解決4例
- Android學習: 疑難問題總結Android
- Windows XP 安裝問題疑難解答(轉)Windows
- python list 排序問題Python排序
- 快取的疑問快取
- iOS:專案中疑難Crash問題集錦iOS
- 程式疑難雜症之1快取快取
- 【疑難系列】 一個看起來是資料庫死鎖的問題資料庫
- Python list,dict問題解答Python
- Windows XP 系統疑難問題巧解決(轉)Windows
- 解決Sql Server警報的疑難問題(轉)SQLServer
- 短影片系統開發疑難問題解決方案
- Python 最難的問題Python
- VBA和Python到底哪個比較難學Python
- 遊戲學基礎建設芻議:建設“遊戲學”的幾個疑難問題遊戲
- Word軟體疑難故障問答(轉)
- VB和Python哪個速度快?Python學習!Python
- 兩個小問題深入淺出List的效能問題
- POI-HSSF的一些疑難問題及解決方式
- C++和Python學哪個好?Python學習難嗎?C++Python
- 關於論壇快取的疑問快取
- Python和Matlab有何區別?哪個更難?PythonMatlab
- GO 指標*&問題疑問Go指標
- Flutter 疑難雜症系列:鍵盤原理及常見問題解決方案Flutter
- SQL Where in list 問題SQL
- 簡單問題:JAVA物件的淺複製,有一個疑問!Java物件
- 如何在直播中解決黑屏、花屏、閃屏問題 | 直播疑難雜症排查
- 快取穿透問題與解決方法快取穿透
- [work] python list中數字與一個數相乘Python
- android 疑難雜症Android
- SpringCloud疑難雜症SpringGCCloud
- docker的疑難雜症Docker
- 征服快取引發的難題快取
- 10個艱難的Java面試題與答案Java面試題
- 如何解決直播中雜音、噪音和回聲問題 | 直播疑難雜症安排