亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python的列表是如何實現的?

Python的列表是如何實現的?

收到一只叮咚 2019-07-09 10:46:08
Python的列表是如何實現的?是鏈表還是數組?我四處搜尋,只發現有人在猜測。我的C知識還不夠好,不能看源代碼。
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

是個動態陣列..實際證明:索引使用(當然,與極小的差異(0.0013!)同時,無論索引是什么:

...>python -m timeit --setup="x = [None]*1000" "x[500]"10000000 loops, best of 3: 0.0579 usec per loop...>
python -m timeit --setup="x = [None]*1000" "x[0]"10000000 loops, best of 3: 0.0566 usec per loop

如果IronPython或Jython使用鏈接列表(它們會破壞許多被廣泛使用的庫的性能),我會感到驚訝,因為它們假設列表是動態數組。


查看完整回答
反對 回復 2019-07-09
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

實際上,C代碼非常簡單。擴展一個宏并刪除一些不相關的注釋,基本結構在listobject.h,它將列表定義為:

typedef struct {
    PyObject_HEAD
    Py_ssize_t ob_size;

    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item == NULL implies ob_size == allocated == 0
     */
    Py_ssize_t allocated;} PyListObject;

PyObject_HEAD包含引用計數和類型標識符。因此,它是一個過分配的向量/數組。當數組滿時調整大小的代碼在listobject.c..它實際上并不是數組的兩倍,而是通過分配

new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);new_allocated += newsize;

每一次,newsize請求的大小(不一定)allocated + 1因為你可以extend由任意數目的元素代替append一個接一個地給他們看)。

另見Python常見問題.


查看完整回答
反對 回復 2019-07-09
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

在CPython中,列表是指針數組。Python的其他實現可以選擇以不同的方式存儲它們。


查看完整回答
反對 回復 2019-07-09
  • 3 回答
  • 0 關注
  • 690 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號