[Python-es] Eficiencia de las listas

Daπid davidmenhur en gmail.com
Mie Ago 7 17:45:56 CEST 2013


2013/8/7 Chema Cortes <pych3m4 en gmail.com>:
> Pytable+hdf5 lo tenía más asociado con datos masivos "jerarquizados".
> Igual estoy equivocado.

PyTables son, esencialmente, tablas de datos, con  columnas
homogéneas. Ofrece una interfaz tipo ndarray (incluyendo slices), pero
que para muchas operaciones optimiza el acceso a disco. También tiene
capacidades de búsqueda "in kernel" (las filas en las que la tercera
columna sea menor que la raíz de dos), que se hacen a velocidad de C.
Es práctico para manejar volúmenes de datos muy grandes que no quepan
en memoria.

> Numexpr (y/o numba) también los tengo pendientes. CArray no lo
> conocía, aunque parece relacionado con los anteriores. ¿Podría numexpr
> mejorar los resultados de numba que ha puesto Daπid?

CArray significa "chunked array". Es un ndarray que no ocupa
necesariamente un trozo de memoria contiguo. Cuando se hacen insertan
o eliminan elementos en algún punto del medio de un ndarray, todo el
resto de la memoria hasta el final ha de desplazarse; un carray, al
estar divididido, sólo necesita mover un bloque pequeño. Creo que no
es algo que te interese ahora.

No estoy seguro de esto, pero por lo que he visto, carray es útil como
estructura de bajo nivel sobre la que montar librerías avanzadas de
manejo de datos, no sé si hay mucho uso en producción directamente.

Por su lado, lo único que Numexpr hace es operaciones elemento a
elemento (o la suma/producto total) sobre arrays optimizando el uso de
la caché de la CPU y paralelizando de forma transparente. En el
clásico ejemplo a + b * c, siendo a, b y c ndarrays, Python puro
realiza primero b * c, lo guarda en una variable temporal que luego
suma a a. Numexpr hace las operaciones elemento a elemento
directamente (a[0] + b[0] * c[0]), saltándose la variable temporal y
aplicando todas las optimizaciones mencionadas. En la documentación no
mencionan nada de revertir un array, y, aunque existiera, dudo que
fuera útil en este caso.

Numba es un optimizador genérico* con mucha maquinaria pesada. La idea
es que sea prácticamente automático, y pueda inferir tipos, compilar,
paralelizar, procesar datos a través de la GPU... de forma
transparente o casi transparente (siempre vienen bien ayudas). Su
mayor inconveniente es que está todavía en desarrollo temprano
(heisenbugs incluidos); y que requiere compilar LLVM.


____
* Aunque a día de hoy sólo es verdaderamente efectivo sobre ndarrays,
y la mayor parte del desarrollo va en esa dirección.


Más información sobre la lista de distribución Python-es