Diferencia entre Listas y Arrays en Python (y razones)

Cuando trabajamos con datos en Python, debemos elegir entre listas nativas y arrays de NumPy. Entender sus diferencias nos ayudará a seleccionar la estructura más adecuada para nuestras necesidades.

Listas de Python

Las listas son estructuras flexibles que vienen integradas en Python.

Características principales:

  • Flexibilidad: Pueden contener diferentes tipos de datos en la misma lista
  • Dinámica: Pueden crecer o reducirse durante la ejecución del programa
  • Mayor consumo de memoria: Cada elemento incluye información adicional
  • Operaciones menos eficientes: Las operaciones matemáticas requieren ciclos explícitos

Ejemplo:

mi_lista = [10, 'producto', 23.5, True]

Arrays de NumPy

Los arrays de NumPy son estructuras especializadas para cálculos numéricos.

Características principales:

  • Homogeneidad: Todos los elementos deben ser del mismo tipo
  • Eficiencia en memoria: Almacenan datos de forma contigua y optimizada
  • Operaciones vectorizadas: Permiten operaciones matemáticas sin ciclos explícitos
  • Optimización para cálculos: Implementan funciones matemáticas eficientes

Ejemplo:

import numpy as np
mi_array = np.array([10, 20, 30, 40])

Comparación con un caso práctico

Imaginemos que tenemos datos de ventas diarias para 10,000 productos durante 5 años (1,825 días por producto).

Memoria utilizada:

  • Listas: Aproximadamente 510 MB (10,000 productos × 1,825 días × 28 bytes por número)
  • Arrays NumPy: Aproximadamente 146 MB (10,000 × 1,825 × 8 bytes por número float64)

Tiempos de operación:

Sumar las ventas de dos productos:

# Con listas (aproximadamente 500 microsegundos)
resultado = []
for i in range(len(ventas_producto1)):
    resultado.append(ventas_producto1[i] + ventas_producto2[i])

# Con arrays (aproximadamente 10 microsegundos)
resultado = ventas_producto1_array + ventas_producto2_array

Calcular el promedio de ventas:

# Con listas (aproximadamente 300 microsegundos)
promedio = sum(ventas_producto) / len(ventas_producto)

# Con arrays (aproximadamente 5 microsegundos)
promedio = np.mean(ventas_producto_array)

Cuándo usar cada estructura

Usa listas cuando:

  • Necesites almacenar diferentes tipos de datos juntos
  • Trabajes con colecciones pequeñas
  • Necesites modificar frecuentemente la estructura
  • No realices muchas operaciones matemáticas

Usa arrays de NumPy cuando:

  • Trabajes con grandes volúmenes de datos numéricos
  • Necesites realizar cálculos matemáticos rápidos
  • Busques optimizar el uso de memoria
  • Trabajes con bibliotecas como pandas o matplotlib

Operaciones comunes con arrays de NumPy

Creación:

import numpy as np
# Array básico
ventas_diarias = np.array([120, 145, 135, 160, 180])

# Array con ceros (para inicializar)
nuevas_ventas = np.zeros(1825)

# Array con valores aleatorios (para simulación)
simulacion_ventas = np.random.randint(50, 200, size=1825)

Operaciones elemento a elemento:

# Ventas de dos productos
producto1 = np.array([100, 150, 120])
producto2 = np.array([80, 90, 110])

# Ventas totales (aproximadamente 2 microsegundos)
ventas_totales = producto1 + producto2  # [180, 240, 230]

# Incremento porcentual (aproximadamente 3 microsegundos)
incremento = producto1 * 1.1  # [110, 165, 132]

Caso de estudio: Análisis de ventas

Para analizar ventas diarias de 10,000 productos durante 5 años, tenemos dos opciones:

  1. DataFrame con arrays: Un DataFrame donde cada celda contiene un array de NumPy con 1,825 valores
  2. DataFrame plano: Un DataFrame con 1,825 columnas (una para cada día)

Ejemplo de operación con la primera opción:

import pandas as pd

# Crear DataFrame con arrays
datos = {
    'Ventas': [np.random.randint(50, 200, size=1825) for _ in range(10000)]
}
df = pd.DataFrame(datos)

# Extraer ventas de verano (días 180-270 de cada año)
def extraer_verano(arr):
    veranos = []
    for año in range(5):
        inicio = año * 365 + 180
        fin = año * 365 + 270
        veranos.extend(arr[inicio:fin])
    return np.array(veranos)

# Tiempo aproximado: 2 segundos para 10,000 productos
ventas_verano = df['Ventas'].apply(extraer_verano)

En resumen, las listas son más flexibles pero los arrays de NumPy ofrecen un rendimiento muy superior para datos numéricos, especialmente cuando trabajamos con grandes volúmenes de información.