파이썬의 []
은 배열으로 구현되어 있으며 링크 된 목록이 아닙니다. 크기 조정은 O (n)이지만 크기 조정은 매우 드물기 때문에 은 0 (1)으로 조정됩니다. 어떻게 작동하는지 잘 모르겠 으면 Wikipedia entry on dynamic arrays을 읽어보십시오. 파이썬의 목록은 매번 2 씩 확장되지는 않지만 그보다 조금 더 복잡합니다. 그러나 확장은 여전히 상각 된 O (1)을 추가하도록 설계되었습니다.
그러나 삽입은 n
항목을 이동해야하기 때문에 항상 비효율적 인 O (n)입니다.
튜플은 목록보다 빠르지 않습니다. 두꺼운 부분 (*)의 불변 목록 일뿐입니다.
사전 테스트 관련 : 정확한 구현에 따라 목록에있는 캐싱은 사전보다 빠릅니다. 그러나 Python의 dicts는 매우 최적화되어 있으며, 특히 소량의 키가 훌륭하게 수행됩니다.
PyObject *
PyList_GetItem(PyObject *op, Py_ssize_t i)
{
if (!PyList_Check(op)) {
PyErr_BadInternalCall();
return NULL;
}
if (i < 0 || i >= Py_SIZE(op)) {
if (indexerr == NULL)
indexerr = PyString_FromString(
"list index out of range");
PyErr_SetObject(PyExc_IndexError, indexerr);
return NULL;
}
return ((PyListObject *)op) -> ob_item[i];
}
을 그리고 이것은 튜플의이다 :
PyObject *
PyTuple_GetItem(register PyObject *op, register 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];
}
당신이 볼 수 있듯이, 그들은 '
(*) 다음 목록의 파이썬 2.6에서 C 기능 "항목을 얻을"입니다 거의 동일합니다. 결국, 일부 유형 및 바운드 검사 후에는 인덱스가있는 간단한 포인터 액세스입니다.
[참조 : Python documentation on Time Complexity for data type operations]
질문에 "목록"이라고 말할 때마다 대신 "링크 된 목록"을 의미하지 않습니까? – MAK