国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python學(xué)習(xí)筆記 --- python中l(wèi)ist的實(shí)現(xiàn)

dongfangyiyu / 476人閱讀

摘要:中的實(shí)現(xiàn)先掛個(gè)英文版的原文鏈接這個(gè)作者還是可以的,我又發(fā)現(xiàn)了他的另外一篇關(guān)于的實(shí)現(xiàn),后面的博文再進(jìn)行介紹。存儲(chǔ)了一系列指向數(shù)據(jù)的指針。虛線方塊代表了沒用到的。切分并移除元素也就是上面代碼中的,會(huì)調(diào)用。

python中l(wèi)ist的實(shí)現(xiàn)

Author : Jasper Yang

School : Bupt

先掛個(gè)英文版的原文鏈接 Laurent Luce"s Blog 這個(gè)作者還是可以的,我又發(fā)現(xiàn)了他的另外一篇關(guān)于dict的實(shí)現(xiàn),后面的博文再進(jìn)行介紹。

在python中實(shí)現(xiàn)list是十分有趣的事情,list在現(xiàn)實(shí)使用中是那么的強(qiáng)大而令人喜愛,所以,下面讓我們一起來(lái)一探究竟。

    >>> l = []
    >>> l.append(1)
    >>> l.append(2)
    >>> l.append(3)
    >>> l
    [1, 2, 3]
    >>> for e in l:
    ...   print e
    ... 
    1
    2
    3

如你所見,list是可迭代的

List object C structure

一個(gè)list對(duì)象在 CPython 中是以如下的數(shù)據(jù)結(jié)構(gòu)保存的。ob_item存儲(chǔ)了一系列指向數(shù)據(jù)的指針。allocated里面存儲(chǔ)的是該list在內(nèi)存分配的大小(slots)

typedef struct {
    PyObject_VAR_HEAD
    PyObject **ob_item;
    Py_ssize_t allocated;
} PyListObject;
List initialization

看看當(dāng)我們初始化一個(gè)list是會(huì)發(fā)生什么,e.g. l =[]

    arguments: size of the list = 0
    returns: list object = []
    PyListNew:
        nbytes = size * size of global Python object = 0
        allocate new list object
        allocate list of pointers (ob_item) of size nbytes = 0
        clear ob_item
        set list"s allocated var to 0 = 0 slots
        return list object 

很重要的一點(diǎn),我們需要注意到 allocated slots (內(nèi)存分配的空間大小)和list的size的區(qū)別。list的size和 len(l) 是一樣的。allocated slots的個(gè)數(shù)就是內(nèi)存中分配了得slot(可以理解成內(nèi)存的block)個(gè)數(shù)。你會(huì)很經(jīng)常看到 allocated 比size還要大。這個(gè)是為了避免多次的重新分配內(nèi)存空間(realloc c函數(shù)),后面我們會(huì)介紹更多。

Append

我們往list里append數(shù)據(jù)后會(huì)發(fā)生什么呢~?c的內(nèi)置函數(shù) app1()會(huì)被調(diào)用。

arguments: list object, new element
returns: 0 if OK, -1 if not
app1:
    n = size of list
    call list_resize() to resize the list to size n+1 = 0 + 1 = 1
    list[n] = list[0] = new element
    return 0

讓我們來(lái)看看這個(gè)list_resize()。它超量地分配了比所需的內(nèi)存更多的內(nèi)存空間。

增長(zhǎng)模式如下:0,4,8,16,25,35,46,58,72,88. . .

arguments: list object, new size
returns: 0 if OK, -1 if not
list_resize:
    new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) = 3
    new_allocated += newsize = 3 + 1 = 4
    resize ob_item (list of pointers) to size new_allocated
    return 0

現(xiàn)在有4個(gè)slot分配給了這個(gè)list去存儲(chǔ)指針,你可以看到l[0]指向了我們剛剛append進(jìn)去的整數(shù)對(duì)象。虛線方塊代表了沒用到的slot。

We continue by adding one more element: l.append(2). list_resize is called with n+1 = 2 but because the allocated size is 4, there is no need to allocate more memory. Same thing happens when we add 2 more integers: l.append(3), l.append(4). The following diagram shows what we have so far.

我們繼續(xù)append更多元素:l.append(2)。list_resize() 被調(diào)用了,n = n + 1。但是因?yàn)閚還是小于 allocated = 4 ,所以沒有必要去重新分配內(nèi)存空間,同樣的我們繼續(xù)append 3 和 4。結(jié)果不變。

Insert

讓我們?cè)谖恢?的地方插入整數(shù)5: l.insert(1,5),ins1() 會(huì)被調(diào)用。

現(xiàn)在分配的內(nèi)存slot個(gè)數(shù)變成了8,這個(gè)增長(zhǎng)的規(guī)律和我們之前講的一模一樣。

Pop

當(dāng)我們使用彈出:l.pop(),listpop()會(huì)被調(diào)用,并且如果list的size小于allocated的一半時(shí),list會(huì)收縮,也就是allocated會(huì)變小。

arguments: list object
returns: element popped
listpop:
    if list empty:
        return null
    resize list with size 5 - 1 = 4. 4 is not less than 8/2 so no shrinkage
    set list object size to 4
    return last element

你可以看到slot 4 仍然指向了原來(lái)的整數(shù)區(qū)域,但是list的size已經(jīng)縮小了,也就是slot4已經(jīng)不屬于這個(gè)list了。

當(dāng)我們?cè)賞op一次后發(fā)現(xiàn),size已經(jīng)小于allocated的一半了,于是allocated變成了6。

Remove

python 的 list 還有個(gè)特殊的移除元素的方法:l.remove(5) ,這里移除的不是第5個(gè)slot而是那個(gè)指向的值是5的slot。listremove() 會(huì)被調(diào)用。

arguments: list object, element to remove
returns none if OK, null if not
listremove:
    loop through each list element:
        if correct element:
            slice list between element"s slot and element"s slot + 1
            return none
    return null

切分list并移除元素(也就是上面代碼中的slice),會(huì)調(diào)用list_ass_slice()。過程如下。

arguments: list object, low offset, high offset
returns: 0 if OK
list_ass_slice:
    copy integer 5 to recycle list to dereference it
    shift elements from slot 2 to slot 1
    resize list to 5 slots
    return 0

希望你們能從我翻譯的這篇文章中學(xué)到東西,提高自己~

paper done 2017/04/21

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40630.html

相關(guān)文章

  • python學(xué)習(xí)筆記-函數(shù)參數(shù)

    摘要:默認(rèn)參數(shù)的坑默認(rèn)參數(shù)的默認(rèn)值指向的必需時(shí)不變對(duì)象。舉一個(gè)例說(shuō)明當(dāng)函數(shù)的默認(rèn)參數(shù)默認(rèn)為一個(gè)可變對(duì)象時(shí),會(huì)出現(xiàn)什么狀況。例如調(diào)用函數(shù)輸出結(jié)果當(dāng)然,如果已經(jīng)又一個(gè)對(duì)象,也可以在傳入時(shí)的名前輸入,會(huì)自動(dòng)將拆分成關(guān)鍵字參數(shù)。 函數(shù)就像是一個(gè)黑盒子,我們將相關(guān)的一些功能打包成一個(gè)函數(shù),后續(xù)再調(diào)用的時(shí)候,我們不再關(guān)心內(nèi)部如何實(shí)現(xiàn),而是只關(guān)心這個(gè)函數(shù)需要輸入(Input)什么,需要輸出(Output)...

    jasperyang 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記 --- pythonlist和numpy矩陣分析

    摘要:中的和中的矩陣分析由于之前在做的源碼學(xué)習(xí),并且將其的源碼翻譯成了的版本。在逛知乎里,我又發(fā)現(xiàn)了很多關(guān)于為什么這么快的討論,很有意思。作者鏈接來(lái)源知乎著作權(quán)歸作者所有。 python中的list和numpy中的矩陣分析 Author : Jasper Yang School : Bupt preface 由于之前在做GIbbsLDA++的源碼學(xué)習(xí),并且將其c++的源碼翻譯成了pyth...

    DobbyKim 評(píng)論0 收藏0
  • python 學(xué)習(xí)筆記 關(guān)于切片

    摘要:我們還可以給切片進(jìn)行命名,有名字的切片,顯然更具有可讀性。對(duì)切片賦值時(shí),賦值符號(hào)右側(cè)必須是一個(gè)可迭代對(duì)象,即使這個(gè)對(duì)象只包含一個(gè)元素,否則會(huì)提示錯(cuò)誤。注以上內(nèi)容主體來(lái)自于流暢的一書中切片和切片原理 切片是python中列表(list)、元組(tuple)、字符串(str)等序列類型都支持的一種操作,但實(shí)際上切片的功能比人們所想象的要強(qiáng)大的多。 切片區(qū)間為什么會(huì)忽略最后一個(gè)元素 當(dāng)只有...

    jerryloveemily 評(píng)論0 收藏0
  • Python學(xué)習(xí)筆記2(解釋器+運(yùn)算符)

    摘要:解釋器的系統(tǒng)上,一般默認(rèn)的版本為,我們可以將安裝在目錄中。中的按位運(yùn)算法則如下下表中變量為,為,二進(jìn)制格式如下邏輯運(yùn)算符圖片邏輯運(yùn)算符測(cè)試實(shí)例中包含了一系列的成員,包括字符串,列表或元組。 3.Python3解釋器 Linux/Unix的系統(tǒng)上,一般默認(rèn)的 python 版本為 2.x,我們可以將 python3.x 安裝在 /usr/local/python3 目錄中。 安裝完成后,...

    happyhuangjinjin 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記 序列

    內(nèi)置序列 容器序列 list, tuple, collections.deque等這些序列能存放不同類型的數(shù)據(jù) 扁平序列 str, byte, bytearray, memoryview, array.array, 這些序列只能容納一種類型數(shù)據(jù) 以上,容器序列存放的是他們所含任意類型對(duì)象的引用,而扁平序列存放的是值而不是引用 列表(list)是最基礎(chǔ)也是最重要的序列類型 列表推導(dǎo) >>> symb...

    godiscoder 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<