Python 3: iteradores en map y filter

martes, 28 de abril de 2009
Las primitivas funcionales map y filter se agregaron a Python en Enero de 1994 por un programador cuya identidad hoy se desconoce. De esta manera, lo que antes se escribía repetidas veces con un bucle puede reducirse a una única y expresiva línea de código.
lista = [1,2,3,4]

# utilizando un bucle
lista_mapeada = []
for e in lista:
    lista_mapeada.append(f(e))

lista_filtrada = []
for e in lista:
    if f(e):
        lista_filtrada.append(e)

# utilizando map y filter
lista_mapeada = map(f, lista)
lista_filtrada = filter(f, lista)
En Python 2.0 se agregaron listas por comprensión, que ofrecen una sintaxis más intuitiva para las primitivas map y filter.
lista_mapeada = [f(e) for e in lista]
lista_filtrada = [e for e  in lista if f(e)]
Si están familiarizados con lenguajes como Haskell, que utilizan evaluación lazy o perezosa conocen algunas de las ventajas de esta característica en un lenguaje de programación: la evaluación de algunas expresiones no se hace inmediatamente sino que se pospone hasta que el valor es realmente necesario.

En el contexto de las primitivas map y filter que nos conciernen, la ventaja de la evaluación lazy es que no se computan hasta tanto no se accede al contenido de las listas resultantes. Con esto en mente, en Python 2.4 se agregaron generadores por comprensión (simplemente remplazando los corchetes por paréntesis en la sintaxis anterior). El resultado es un generador: un objeto que se comporta parcialmente como una lista, dado que puede iterarse sobre el (aunque no puede indexarse y accededer directamente a su i-ésimo elemento).
gen_mapeado = (f(e) for e in lista)
gen_filtrado = (e for e  in lista if f(e))
La mejora más inmediata es la performance: en lugar de aplicar la función completamente en el momento, no se hacen los cómputos requeridos hasta que se accede al resultado. Por esta razón, la librería estándar itertools incluye primitivas imap, ifilter y varias más que devuelven generadores en lugar de listas, puesto que en muchos casos este comportamiento es deseable.

En Python 3, sencillamente se cambió el comportamiento de las primitivas convencionales para que devuelvan iteradores en lugar de listas. Así, los nuevos map, filter, zip y compañía se comportan como los anteriores itertools.imap, iterators.ifilter y iterators.izip.
# Python 3
>>> l = map(f, [1,2,3,4])
>>> l[2]
TypeError: object is unsubscriptable
El nuevo comportamiento no es compatible hacia atrás, pero puede resolverse esta diferencia sencillamente cambiando todas las llamadas map(l) (y los otros) por list(map(l)), lo cual produce un comportamiento casi idéntico en Python 3 y Python 2 (y digo casi porque si el map original devolvía una tupla o un string, pueden haber diferencias).

Envisioning Information

jueves, 23 de abril de 2009
Hace unos días saqué de la Infoteca del Departamento de Computación de la UBA el libro Envisioning Information de Edward Tufte, y terminé de hojearlo hoy mientras me comía un rico sandwich (tenía una pinta tal que le tuve que sacar una foto con la cámara de la compu).

El autor

Edward Tufte es un profesor de Yale muy reconocido por sus estudios (y sus libros) sobre diseño y presentación de la información, y un ferviente crítico del mal uso de PowerPoint. Sin duda es uno de los autores más reconocidos del área, al punto que un artículo del New York Times lo llamó una vez el Da Vinci de los datos.

Una idea hoy popular sobre la que Tufte atrajo la atención hace mucho tiempo son los sparklines, pequeños gráficos de tamaño similar a las palabras de un documento que permiten representar mucha información en un espacio reducido y sin agregar una cantidad significativa de ruido gráfico. Los sparklines son hoy moneda corriente en aplicaciones de visualización de información que tengan mucha densidad de datos, como podrían ser aplicaciones de monitoreo de bolsas financieras, o de estadísticas detalladas de utilización de sitios web (o tal vez para cuestiones más mundanas, como seguimiento de los accidentes con mascotas en diversas líneas aéreas).


El libro

Confusion and clutter are failures of design, not attributes of information.
"La confusión y el desorden son fallas de diseño, no atributos de la información". Esta frase de Tufte resume el espíritu del área de la visualización de información, que busca la manera más apropiada de entregar datos a las personas para que puedan ser utilizados.

El libro no solo está hermosamente editado y encuadernado (como es de esperarse para un libro cuyo contenido refiere al diseño), sino que además utiliza una lógica que encuentro de lo más apropiada. A lo largo de sus 6 breves capítulos, el autor presenta cada uno de los aspectos esenciales en la construcción de un documento gráfico, así como ideas y efectos que son de interés, acompañando cada uno de ejemplos no solo vistosos y muy atinados, sino que provenientes de contextos históricos y sociales diversos. Así, el libro es mitad estudio de la visualización, y mitad anécdotas gráficas observadas en detalle. Algunas cosas que aparecen:
  • La tabla donde se resumen los antecedentes penales de los testigos en el caso contra el mafioso John Gotti, que fue la última pieza de evidencia que el jurado pidió rever antes de absolverlo, lo que le valió por mucho tiempo el apodo de "teflon Don" (ya que nunca quedaba pegado)
  • Una factura de hospital de los 26 últimos días de vida de Mrs. K en 1984, donde un médico externo comenta en base a los cargos de la factura la situación de la paciente, así como las ramificaciones de los costos (que son de unos US$50.000)
  • Las anotaciones de Galileo Galilei sobre sus primeras observaciones de las lunas de Júpiter
  • El monumento a la memoria de los veteranos de Vietnam en Washington DC, y la lógica detrás del diseño de la arquitecta Maya Lin
A lo largo de este interesante recorrido, Tufte introduce varios conceptos relativos a la presentación de datos, como la noción de 1+1=3 o el uso de pequeños múltiples.

1+1=3 se refiere al hecho de que dos elementos de una página pueden generar más información contextual por la interacción que hay entre ellos. A continuación un ejemplo: los círculos construyen, por la relación entre sus posiciones, un quinto elemento (el rectángulo central). Este efecto debe cuidarse ya que bien usado puede ser de ayuda para la comunicación, pero si se lo ignora se puede producir ruido visual involuntariamente. El estilo de escritura es muy ameno y conciso, y puede leerse en profundidad o simplemente sobrevolarse rápidamente (el libro consta de apenas 120 páginas). Es interesante que esto concuerda con el estilo que el autor pregona para mostrar información compleja: una visualización que pueda verse tanto a escala micro como macro (según se desee) y en ambos casos exhiba efectivamente los datos. Un detalle más que denota lo pensado que está el libro.

Work Hard. Be nice.

lunes, 13 de abril de 2009
Hace unos días me llegó un pedido de libros de Amazon y el primero que leí fue Work Hard. Be Nice. de Jay Mathews.

Antes que nada hace falta aclarar que no se trata de un libro de autoayuda. El libro fue escrito por un periodista de educación y cuenta la historia de Dave Levin y Mike Feinberg, dos graduados universitarios que tras egresarse ingresaron al programa Teach for America, en el que jóvenes universitarios recién recibidos tienen la posibilidad de entrar en las aulas de escuelas primarias y medias como maestros de jóvenes en grupos étnicos y sociales desfavorecidos.

Allí se conocieron y comenzaron a gestar el Knowledge is Power Program (KIPP), que hoy cuenta con más de 60 escuelas en Estados Unidos, y tiene un nivel académico sorprendente, y más aún si se tiene en cuenta el estrato social del que provienen la mayoría de sus alumnos. Las escuelas KIPP son charter schools, colegios públicos administrados por entidades privadas que reciben dinero del estado para funcionar, de modo que son gratuitas pero no necesitan ceñirse al sistema de educación convencional en lo que se refiere a bibliografía, horarios ni programas de estudio.

KIPP no tiene ninguna receta mágica para el aprendizaje: simplemente tienen días de escuela muy extensos (más de 9 horas, sin contar una o dos horas adicionales de tarea para hacer en casa, contra las aproximadamente 6 que tiene un americano promedio) y un alto nivel de exigencia, así como un énfasis muy fuerte en la calidad de los docentes para transmitir y para mantener motivados a los alumnos. El sistema le confiere además una alta importancia a los resultados de los alumnos: es más importante obtener buen rendimiento, que cual es exactamente la manera de lograrlo.

El libro es una excelente crónica periodística (y me gusta mucho el género), muy amena de leer por sus capítulos muy cortos. Conocí el libro cuando Bill Gates lo regaló a la audiencia de TED en su Ted Talk de 2009.

Personalmente me da un poco de escalofríos pensar en un sistema tan pragmático (por llamarlo de alguna manera), pero retrospectivamente me doy cuenta de que yo también pasaba 9 horas por día en el colegio - y no es que haya sido muy ameno - y de que el docente que más me marcó en toda mi escolaridad tenía un perfil en muchos aspectos similar al de los maestros KIPP. No pude evitar al leer el libro revivir las poco ortodoxas técnicas de aprendizaje y motivación de Bernard Desbois, mi profesor de matemáticas de cuarto año, que además de análisis y álgebra nos mostró lo que era realmente una persona que ama su trabajo y le pone todo el empeño necesario. Varios años después recibimos un mail de una asociación de padres de Bangkok preguntando, esencialmente, qué estaba haciendo este tipo con sus hijos, y si era normal lo que estaba pasando: cantos, gritos, aplausos, exámenes semanales y otros excentricismos. La realidad es que de normal no tenía nada, pero fue una de las personas que más me marcaron en todo mi período escolar.