爲什麼需要花費時間訪問被視爲常量的非同類列表中的元素或者如何在存儲器中存儲非同類列表的情況下蟒蛇?爲什麼需要花費時間訪問被視爲常量的非同類列表中的元素
如果列出了同質性列表,那麼知道類型和位置,可以確定內存位置,但是如果非均勻列表如此快以至於將其視爲恆定時間的函數,它是如何完成的?
查看此頁Does Python use linked lists for lists? Why is inserting slow?我假設它將元素存儲在連續的內存位置。
爲什麼需要花費時間訪問被視爲常量的非同類列表中的元素或者如何在存儲器中存儲非同類列表的情況下蟒蛇?爲什麼需要花費時間訪問被視爲常量的非同類列表中的元素
如果列出了同質性列表,那麼知道類型和位置,可以確定內存位置,但是如果非均勻列表如此快以至於將其視爲恆定時間的函數,它是如何完成的?
查看此頁Does Python use linked lists for lists? Why is inserting slow?我假設它將元素存儲在連續的內存位置。
元組實際上是指向不同元素的指針數組。索引一個元組歸結到索引這個指針數組(O(1))並找出我們指向的指針(O(1))。
你可以在tupleobject.c
和tupleobject.h
中看到自己。用於索引元組的代碼是:
PyObject *
PyTuple_GetItem(PyObject *op, Py_ssize_t i)
{
if (!PyTuple_Check(op)) {
PyErr_BadInternalCall();
return NULL;
}
if (i < 0 || i >= Py_SIZE(op)) {
PyErr_SetString(PyExc_IndexError, "tuple index out of range");
return NULL;
}
return ((PyTupleObject *)op) -> ob_item[i];
}
你可以看到最後一行指標底層C數組:ob_item[i]
(一些初步的檢查後)。 ob_item
實際上是一個PyObject
指針的數組:
typedef struct {
PyObject_VAR_HEAD
PyObject *ob_item[1];
/* ob_item contains space for 'ob_size' elements.
* Items must normally not be NULL, except during construction when
* the tuple is not yet visible outside the function that builds it.
*/
} PyTupleObject;
Python中的每個對象都有開銷。這描述了使用該對象所需的信息。實際的「數據」不需要存儲在該「標題」中。所以,一個列表只包含一個引用列表... –
Python'list'是一個數組。 –
@DavidHeffernan:小記:Python列表被實現爲_dynamic_ arrays – inspectorG4dget