成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 疑難問題:[] 與 list() 哪個快?為什么快?快多少呢?

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

[[346335]]

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

  • 方法一:使用成對的方括號語法
    1. list_a = [] 
  • 方法二:使用內置的 list()
    1. listlist_b = list() 

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

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

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

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

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

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

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

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

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

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

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

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

  1. >>> from dis import dis 
  2. >>> dis("[]") 
  3. >>> 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() 涉及的執行步驟更多,因此它比 [] 要慢一些。

3. list() 的速度提升

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

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

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

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

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

 

責任編輯:趙寧寧 來源: Python貓
相關推薦

2020-02-27 21:03:30

調度器架構效率

2024-02-26 21:15:20

Kafka緩存參數

2020-02-27 15:44:41

Nginx服務器反向代理

2023-06-08 18:25:40

Doris場景查詢

2024-03-25 02:00:00

Vite開發

2011-05-06 14:05:22

打印機照片打印

2012-05-04 09:18:46

2020-03-30 15:05:46

Kafka消息數據

2021-06-09 09:32:58

Esbuild 工具前端

2017-04-18 22:50:10

OSPF疑難問題

2009-12-23 08:53:56

Windows 7遠程協助

2009-12-25 10:59:08

WPF Timer

2016-12-14 12:02:01

StormHadoop大數據

2017-02-14 14:20:02

StormHadoop

2021-05-27 20:56:51

esbuild 工具JavaScript

2023-08-29 07:46:08

Redis數據ReHash

2020-10-15 09:19:36

Elasticsear查詢速度

2024-04-03 09:23:31

ES索引分析器

2021-05-31 07:44:08

Kafka分布式系統

2022-12-15 18:20:46

ClickHouse存儲引擎
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 你懂的在线视频播放 | 一区二区av| 久久精品男人的天堂 | 久久亚洲国产 | 国产91在线 | 亚洲 | 天天拍天天色 | a级在线免费观看 | 97久久精品午夜一区二区 | 国产一区999| 日韩一区精品 | 午夜精品一区 | 福利片在线看 | 亚洲精品久久久久国产 | 久久久久国产一区二区三区四区 | 久久久精选 | 国产成人免费一区二区60岁 | 蜜桃av人人夜夜澡人人爽 | 永久免费av | 中文字幕亚洲国产 | 亚洲精品欧美一区二区三区 | 在线看av网址 | k8久久久一区二区三区 | 亚洲第一成年免费网站 | 一区二区三区国产 | 天堂一区二区三区 | 久久久成人免费一区二区 | 国产精品自产拍 | 天堂成人国产精品一区 | 亚洲高清视频在线观看 | 国产女人与拘做受视频 | 日韩成人中文字幕 | 爱爱无遮挡 | 五月天国产视频 | 国产精品18久久久 | 亚洲日韩欧美一区二区在线 | 91精品国产综合久久久久久丝袜 | 成人国产精品久久 | 成人在线观看免费视频 | 欧美三级免费观看 | 日韩欧美在线视频 | 亚洲h视频|