Python's []
se implementa como una matriz , no es una lista vinculada. Aunque el cambio de tamaño es O (n), se le agrega amortizado O (1), porque los cambios ocurren muy raramente. Si no está familiarizado con cómo funciona esto, lea esto Wikipedia entry on dynamic arrays. La lista de Python no se expande por un factor de 2 cada vez, es un poco más complicado que eso, pero las expansiones todavía están diseñadas para agregar O amortizado (1).
Inserción en el medio, sin embargo, es siempre una O ineficiente (n), porque n
artículos pueden tener que ser movido.
tuplas no son más rápido que las listas - son simplemente listas inmutables bajo el capó (*).
En cuanto a la prueba de diccionario: dependiendo de su aplicación exacta, el almacenamiento en caché en una lista será más rápido que con un diccionario. Sin embargo, los dictados de Python están altamente optimizados, y especialmente para pequeñas cantidades de teclas funcionarán muy bien.
(*) He aquí de una lista "conseguirá el artículo" función C en Python 2.6:
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];
}
Y esto es una tupla de:
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];
}
Como se puede ver, que' son casi exactamente lo mismo. Al final, después de algún tipo y comprobación encuadernada, es un acceso de puntero simple con un índice.
[Referencia: Python documentation on Time Complexity for data type operations]
¿No te refieres a "lista vinculada" cada vez que mencionas "lista" en tu pregunta? – MAK