Historia del tema
Las listas (list) son uno de los tipos de datos integrados básicos en Python desde las primeras versiones del lenguaje. Con el tiempo, su estructura interna ha mejorado, en particular, para aumentar el rendimiento y la comodidad de programación.
Problema
Es importante entender que las listas en Python no se implementan como listas enlazadas, sino como arreglos dinámicos. Esta idea errónea puede llevar a un código ineficiente o a un cálculo incorrecto de la complejidad de las operaciones.
Solución
Las listas se implementan como arreglos dinámicos que aumentan su tamaño de memoria asignada "bruscamente" (expandíéndose) cuando es necesario, para evitar costos constantes al agregar elementos. Esto permite insertar y eliminar elementos al final de la lista en un tiempo amortizado de O(1). La inserción o eliminación en el medio/principio requiere mover elementos, lo que toma O(n) tiempo.
Ejemplo de código:
my_list = [1, 2, 3] my_list.append(4) # Adición al final my_list.insert(1, 'a') # Inserción por índice print(my_list)
Características clave:
¿Se puede considerar list en Python como análogo de un arreglo en C? ¿Cuál es la diferencia?
No, un arreglo en C contiene elementos de tipo fijo, ubicados de manera consecutiva en la memoria. La lista de Python es un arreglo de punteros a objetos, cada uno de los cuales apunta a un objeto independiente de tipo arbitrario en el heap.
¿Qué pasará si se insertan elementos al principio de la lista en un bucle? ¿Es rápido?
No, es lento: al insertar al principio (posición 0) se desplazan todos los elementos existentes a la derecha cada vez. La complejidad amortizada es O(n) por operación, lo que puede llevar a una degradación del rendimiento para listas grandes.
¿Cuál es la diferencia entre los operadores + y append/extend para listas?
lst1 = [1, 2] lst2 = [3, 4] lst3 = lst1 + lst2 # lst3 es una nueva lista lst1.append(lst2) # lst1 se convierte en [1, 2, [3, 4]] lst1.extend(lst2) # lst1 se convierte en [1, 2, 3, 4], si lst1 no se reinicia después de la anterior append
En un proyecto se utilizó una lista para almacenar y eliminar constantemente los primeros elementos. Se notó una desaceleración notable con grandes volúmenes de datos.
Pros:
Contras:
Después de identificar el problema, reemplazamos la lista por collections.deque, que está optimizado para tales operaciones.
Pros:
Contras: