python之[] 與 list()分析

2021-03-02 從零開始學機器學習

    Good, better, best, never let it rest, 'Til your good is better and your better is best。

    使用Python進行業務邏輯開發,Dict與List數據結構絕對是使用最多的,今天就來聊聊List數據結構的兩種創建方式,並且簡要分析下他們的區別。

# 使用一對中括號
list_a = []# 使用內置函數
list_b = list()

    SO.

這兩種方法有什麼不一樣呢?哪個會快一點呢?



我們使用timeit函數對兩種創建方式進行時間上的度量:

import timeit
size = 1000
time_1 = 0.0
time_2 = 0.0
for index in range(size):
time_1 += timeit.timeit('[]')
time_2 += timeit.timeit('list()')else:

    print(time_1/time_2)

Out:

0.2656637479756005

經過1000次的創建空列表的比較,使用[] 創建List對象比使用list() 能快2-3倍。



    為了搞清楚他們為何差距那麼大,我們先來看看他們分別在創建對象時都幹了什麼事情。

    我們使用dis模塊中的dis方法觀察下兩種方式創建對象執行的字節碼:

from dis import dis
print(dis('[]'))
1 0 BUILD_LIST 0
2 RETURN_VALUE
print(dis('list()'))
1 0 LOAD_NAME 0 (list)
2 CALL_FUNCTION 0
4 RETURN_VALUE



    首先,對於 [],它是 Python 中的一組字面量(literal),像數字之類的字面量一樣,表示確切的固定值,也就是說,Python 在解析到它時,就知道它要表示一個列表,因此會直接調用解釋器中構建列表的方法(對應BUILD_LIST),來創建列表,所以是一步到位。

    而對於 list(),「list」只是一個普通的名稱,並不是字面量,也就是說解釋器一開始並不認識它。因此,解釋器的第一步是要找到這個名稱(對應LOAD_NAME)。它會按照一定的順序,在各個作用域中逐一查找(局部作用域--全局作用域--內置作用域),直到找到為止,找不到則拋出NameError異常。

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

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

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



    在Python3.8時,提出了 Vectorcall(a fast calling protocol for CPython) 優化方案,並會在Python3.9時正式加入發行版。

    簡單來說Vectorcall可以加速 CPython 解釋器在調用類對象時的速度,極大的提升 list()、tuple()、dict() 等主要類型的調用速度,同時它還可以被用在自定義的類上。

    親測測度可以提升1倍以上,感興趣的可以安裝Python3.9體驗下。

Had func!

相關焦點

  • Python之list列表數據類型講解
    前言在python中,list列表數據類型其實就是一個容器,可以放置大量元素的集合。同時,list列表也有很多特點和使用場景,本文主要講解list列表的函數方法。概念list列表是一個集合,一個容器,同Java語言中的數組是一樣的,唯一的不同之處在於,Java中的數組類型只能放置同一種數據類型,而Python中的列表可以放置不同的數據類型。
  • python教程第七課:Python基礎之list集合
    Python基礎之list集合今天我們主要來看看如何使用python裡面的list集合1、list概念:list是python裡面的一種數據類型,是一種有序的集合列表,具有可變性。定義:使用[] 的方式定義list集合,names = ['a','b','c'] #定義一個 names的listnames = [] #定義一個空的list集合常用方法:a) 查看list集合的長度使用len()len(names) #返回names集合長度3
  • Python:Pandas的DataFrame如何按指定list排序
    前言寫這篇文章的起由是有一天微信上一位朋友問到一個問題,問題大體意思概述如下:現在有一個pandas的Series和一個python的list,想讓Series按指定的list進行排序,如何實現?,可以分為三種情況:相等的情況下,可以使用 reorder_categories和 set_categories方法;list的元素比較多的情況下, 可以使用set_categories方法;list的元素比較少的情況下, 也可以使用set_categories方法,但list中沒有的元素會在DataFrame中以NaN表示。
  • Python初步之list持久化
    今天蟲蟲就以Python腳本為例,和大家一起來說說Python中list列表持久化的各種方法。普通寫入在Pyton的句柄寫入模式下,可以對打開句柄(文件)任意寫入內容,我們通過打開需要保存到的文件句柄,然後通過循環遍歷列表,以次寫入文件就可以完成列表的保存。實際上這個過程是所有語言中保存內容到文件的內容,也不能算是實際上的數據持久化。
  • python數據分析專題 (7):python數據分析模塊
    python是一門優秀的程式語言,而是python成為數據分析軟體的是因為python強大的擴展模塊。
  • Python的List與Tuple
    /usr/bin/python3list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ]tinylist = [123, 'runoob']print (list) # 輸出完整列表print (list[0]) # 輸出列表第一個元素print (list[
  • Python數據類型之列表list
    # 列表是python中最基本的數據結構,它是一個有序序列,序列中的每個元素都分配一個數字(位置,索引)# 1、我們可以使用 方括號,中括號[]來創建列表# 2、我們可以直接將序列放在list(seq)# python中的列表是可變的,且列表內部由元素組成
  • [快學Python3]List(列表)
    4, 5, 6]list方法在python中,有大量的方法用於list的處理,下面我們看看示例:append(obj)在列表末尾添加新的對象count(obj)統計列表中某個元素出現的次數extend(seq)在列表末尾追加另外一個序列(即列表擴展)index
  • python給list排序的簡單方法
    那你知道在python中如何給列表排序嗎?今天,小編教教大家如何給列表排序。sort()方法會對list中元素按照大小進行排序list.sort(key=None,reverse=False)實例:In [57]: l=[27,47,3,42,19,9]In [58]: l.sort()In [59]: lOut[59]: [3, 9, 19,
  • Python 列表(List)操作方法詳解
    /usr/bin/pythonlist1 = ['physics', 'chemistry', 1997, 2000];list2 = [1, 2, 3, 4, 5, 6, 7 ];print "list1[0]: ", list1[0]print "list2[1:5]: ", list2[1:5]以上實例輸出結果:list1
  • Python數據類型-List介紹(上)
    列表(list)作為python最基礎也是最重要的數據類型之一,在python數據分析以及其他用途中有著重要的作用。
  • Python List是怎麼實現的
    >    call list_resize() to resize the list to size n+1 = 0 + 1 = 1    list[n] = list[0] = new element    return 0上面有4個slot被分配來擴容,只有第一個l[0]指向了剛剛追加的元素。
  • python os.listdir()亂碼解決方案
    /usr/bin/python# -*- coding: UTF-8 -*-import os, sys# 打開文件path = "/var/www/html/"dirs = os.listdir( path )# 輸出所有文件和文件夾for file in dirs:  print(file
  • 圖說Python系列之list核心的6個特性
    list萬能容器List是Python中的一個複合類型數據結構,大家可以讓任意類型的數據放入list合法範圍內的任何位置我們可以將各種數據放入到list中,而不需要為不同類型聲明所有的list可迭代:一步一步來
  • Python——list列表和tuple元組
    list列表是Python內置的一種數據類型。list是一種有序的集合,可以隨時添加和刪除其中的元素。比如,列出班裡所有同學的名字,就可以用一個list表示:classmates = ['張三', '李四', '王五']print(classmates)運行結果如下:變量classmates就是一個list。
  • Python入門學習之數據分析實戰獲取數據
    想用一個完整的案例講解Python數據分析的整個流程和基礎知識,實際上以一個數據集為例,數據集是天池上的一個短租數據集,後臺回覆:短租數據集,即可獲得。先來想一下數據分析的流程,第一步獲取數據,因此本節內容就是獲取數據以及對數據的基本操作。
  • python 詞頻分析
    python詞頻分析昨天看到幾行關於用 python 進行詞頻分析的代碼,深刻感受到了 python 的強大之處。(尤其是最近自己為了在學習 c 語言感覺被它的語法都快搞炸了,python 從來沒有那麼多要求)代碼如下:import redef parse(text):        text = re.sub(r'[^\w ]', ' ', text)    text = text.lower()     word_list = text.split(
  • python list 排序的兩種方法及實例講解
    用 list 的內建函數 list.sort 進行排序list.sort(func=None, key=None, reverse=False) Python實例:123456>>> L = [2,5,8,9,3]  >
  • python3.6中數據類型之list和tuple的比較
    list使用中括號,有序,可修改其中的數值tuple使用小括號,有序,不可修改其中的數值我們分別定義一個list,一個tuple.python在這裡的門門道道還是比較多的。1:下標制比如上面定義的LIST.計算機裡面的標籤是這樣的list =[list[0],list[1],list[2],list[3]]或者list=[list[-4],list[-3],list[-2],list[-1]]比如我們需要完整輸出。
  • stata調用python爬取時間數據——借他山之石以攻玉
    爬取網頁原始碼的程序如下(此處原理參考往期推文《玩轉python之「手把手」教你爬數據》):def GetSourceCode(page) : import requests import time url = "http://www.cninfo.com.cn/new/information/getPrbookInfo" headers