arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Listas doble mente enlazadas con python

Eduardo Ismael Garcia

Full Stack Developer at Código Facilito.

av_timer 3 Min. de lectura

remove_red_eye 5861 visitas

calendar_today 21 Agosto 2023

Para esta nueva entrega en CódigoFacilito me gustaría hablemos sobre una forma más sencilla de implementar las estrcuturas de datos pilas y colas. Y no, no te preocupes, no implementaremos nuestras propias estructuras y/o algoritmos, si no que haremos uso de las que Python ya nos ofrece. Recordemos que Python viene con baterias incluidas.

Será un post sumamente interesante, así que te invito a que te quedes.

Bien, ahora sí, son más por añadir, comencemos.

Listas como estructuras

Probablemente los primero que se nos viene a la mente la oir los conceptos de pilas y colas en Python es pensar que podemos implementar estas estructuras con objetos de tipo listas, ya que las listas nos ofrecen los métodos insert, append y pop, métodos que, respectivamente, nos permite insertar un elemento en un índice en particular, insertar un elemento al final de la colección o eliminar el último elemento de la coleccíón.

Recordemos que las pilas y colas funciona con el principio el último en entrar es el primero en salir para las pilas y el primero en llegar es el primero en salir para las colas.

Por lo tanto, para implementar, por ejemplo una pila nuestro código pudiera quedar de la siguiente manera.

pila = []

# Agregar elementos a la pila (push)
pila.append(10)
pila.append(20)
pila.append(30)

# Eliminar elementos de la pila (pop)
elemento = pila.pop()  # Elimina y retorna el último elemento agregado (30)
print(elemento)  # Output: 30

# Imprimir la pila actual
print(pila)  # Output: [10, 20]

Esto puede verse bien, y de hecho va funcionar, sin embargo si trabajamos con un gran número de datos, por ejemplo miles, cientos de miles o millones de registros, el perfomance comienza a decaer.

Tareas como insertar un nuevo elemento al principio de un colección de miles de registro es algo que ya computacionalmente hablando para python es costoso.

Veamos.

import timeit

def inser_elements():
    numbers = []

    for element in range(0, 100_000):
        numbers.insert(0, element)

if __name__ == '__main__':
    result = timeit.timeit(inser_elements, number=1)
    print(result)

Una tarea como insertar 100K registros le toma a Python poco más de 2 segundos. Algo que no esta del todo bien.

Snap list.png

Deque

Por lo tanto, siempre que quieres realizar tareas que impleque insertar o eliminar elementos al princio final de la colección, por ejemplo cuando trabajar con pilas o colas, te recomiendo dejar a un lado las listas y usar deque.

Deque por su abreviación: double-ended queue, es una lista doble mente finalizada, esto quiere decir que acciones como añadir al principio o final de la colección, o así como eliminar elementos al principio o final de la colección, tiene una complejidad O1, el mejor performance que podemos obtener en la notación Big O.

Y lo mejor de todo es que deque ya se encuentra en la biblioteca estandar de Python así que no hay que instalar absolutamente nada simplemente importamos y listo

Veamos.

from collections import deque

mi_deque = deque()

mi_deque.append(10)
mi_deque.append(20)
mi_deque.append(30)

mi_deque.appendleft(5)

print(mi_deque[1]) 

mi_deque.pop()
mi_deque.popleft()

print(mi_deque) 

Importamos de collections y comenzamos a definir ya sea nuestro pila o cola.

Podemos añadir elementos al final de la colección con append, o añadir elementos al principio de la colección con appendleft.

Lo mismo con pop, para eliminar elementos de la derecha o popleft para eliminar elementos de la izquieda.

import timeit
from collections import deque

def inser_elements():
    numbers = deque()

    for element in range(0, 100_000):
        numbers.appendleft(element)

if __name__ == '__main__':
    result = timeit.timeit(inser_elements, number=1)
    print(result)

Siguiendo con nuestro ejemplo anterior, utilizando deque logramos reducir el tiempo de ejecución para insertar un 100l registros de 2.23 segundo a

0.01 Milisegundos

Snap deque.png

Definitivamente Deque es la mejor opción para realizar tareas que impliequen adir o modificar elementos al principio o final de la colección.

Ahora ya lo sabes, siempre que quieres implementar una pila o cola con Python definitivamente te recomiendo usar Deque.

y cuéntanos, ya conocías Deque, ya lo has utilizado en alguno de tus proyectos, déjanoslo saber en la sección de comentarios.

Bootcamp Ciencia de Datos

12 semanas de formación intensiva en los conocimientos, fundamentos, y herramientas que necesitas para ser científico de datos

Más información