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:
- DataFrame con arrays: Un DataFrame donde cada celda contiene un array de NumPy con 1,825 valores
- 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.