¿Es una lista vinculada, una matriz? Busqué alrededor y solo encontré personas adivinando. Mi conocimiento de C no es lo suficientemente bueno como para mirar el código fuente.
183
¿Es una lista vinculada, una matriz? Busqué alrededor y solo encontré personas adivinando. Mi conocimiento de C no es lo suficientemente bueno como para mirar el código fuente.
Es una matriz dinámica . Prueba práctica: la indexación lleva (por supuesto, con diferencias extremadamente pequeñas (¡0.0013 µsecs!)) El mismo tiempo independientemente del índice:
...>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
Me sorprendería que IronPython o Jython usaran listas vinculadas: arruinarían el rendimiento de muchas bibliotecas ampliamente utilizadas basadas en el supuesto de que las listas son matrices dinámicas.
x=[None]*1000
, lo que deja la medición de cualquier posible diferencia de acceso a la lista bastante imprecisa. Debe separar la inicialización:-s "x=[None]*100" "x[0]"
El código C es bastante simple, en realidad. Al expandir una macro y eliminar algunos comentarios irrelevantes, se encuentra la estructura básica
listobject.h
, que define una lista como:PyObject_HEAD
contiene un recuento de referencia y un identificador de tipo. Entonces, es un vector / matriz que se sobreasigna. El código para cambiar el tamaño de dicha matriz cuando está lleno está enlistobject.c
. En realidad, no duplica la matriz, sino que crece asignandoa la capacidad cada vez, donde
newsize
está el tamaño solicitado (no necesariamenteallocated + 1
porque puede hacerloextend
por un número arbitrario de elementos en lugar deappend
'uno por uno).Consulte también las preguntas frecuentes de Python .
fuente
array
se preferirá el módulo o NumPy.En CPython, las listas son matrices de punteros. Otras implementaciones de Python pueden optar por almacenarlas de diferentes maneras.
fuente
Esto depende de la implementación, pero IIRC:
ArrayList
Por lo tanto, todos tienen acceso aleatorio O (1).
fuente
O(1)
que la indexación de listas es una suposición bastante común y válida, ninguna implementación se atrevería a romperla.Sugeriría el artículo de Laurent Luce "Implementación de la lista de Python" . Fue realmente útil para mí porque el autor explica cómo se implementa la lista en CPython y utiliza excelentes diagramas para este propósito.
...
...
...
...
fuente
aggregation
, nocomposition
. Ojalá hubiera una lista de composición también.De acuerdo con la documentación ,
fuente
Como otros han dicho anteriormente, las listas (cuando son apreciablemente grandes) se implementan asignando una cantidad fija de espacio y, si ese espacio debe llenar, asignando una mayor cantidad de espacio y copiando los elementos.
Para entender por qué el método está O (1) amortizado, sin pérdida de generalidad, supongamos que hemos insertado elementos a = 2 ^ n, y ahora tenemos que duplicar nuestra tabla al tamaño 2 ^ (n + 1). Eso significa que actualmente estamos haciendo 2 ^ (n + 1) operaciones. Última copia, hicimos 2 ^ n operaciones. Antes de eso hicimos 2 ^ (n-1) ... hasta 8,4,2,1. Ahora, si sumamos estos, obtenemos 1 + 2 + 4 + 8 + ... + 2 ^ (n + 1) = 2 ^ (n + 2) - 1 <4 * 2 ^ n = O (2 ^ n) = O (a) inserciones totales (es decir, O (1) tiempo amortizado). Además, debe tenerse en cuenta que si la tabla permite eliminaciones, la reducción de la tabla debe realizarse en un factor diferente (por ejemplo, 3x)
fuente
Una lista en Python es algo así como una matriz, donde puede almacenar múltiples valores. La lista es mutable, lo que significa que puede cambiarla. Lo más importante que debe saber, cuando creamos una lista, Python crea automáticamente una referencia_id para esa variable de lista. Si lo cambia asignando otras variables, la lista principal cambiará. Probemos con un ejemplo:
Anexamos
my_list
pero nuestra lista principal ha cambiado. La lista de esa media no se asignó como una lista de copia asignada como referencia.fuente
En CPython, la lista se implementa como matriz dinámica y, por lo tanto, cuando agregamos en ese momento, no solo se agrega una macro, sino que se asigna algo más de espacio para que cada vez no se agregue un nuevo espacio.
fuente