Mi apuesta para el larguísimo plazo: Julia

Larguísimo, arriba, significa algo así como 10 o 20 años. Vamos, como cuando comencé con R allá por el 2001. R es, reconozcámoslo, un carajal. Pocas cosas mejores que esta para convencerse. No dejo de pensar en aquello que me dijo un profesor en 2001: que R no podría desplazar a SAS porque no tenía soporte modelos mixtos. Yo no sabía qué eran los modelos mixtos en esa época pero, desde entonces, vine a entender y considerar que “tener soporte para modelos mixtos” venía a ser como aquello que convertía a un lenguaje para el análisis de datos en una alternativa viable y seria a lo existente. Y mirad esto. Obviamente, lo de los modelos mixtos no es más que una metáfora. Realmente significa algo así como “el sistema X tiene muchas cosas y su alternativa, Y, es un mero juguete”. Pero no hay nada que impida que Y comience a implementar todo aquello que le falta. Además, mucho más rápida y eficientemente. P.e., ¿cuánto tardó R en dotarse de su gramática de los gráficos? Pues bien, Juilia ya los tiene. (¿Cómo se dice leapfrog en español?) Dicho de otra manera, R ha sido el estado del arte en computación estadística en los últimos años. Ha avanzado por prueba y error. Pero ahora, cualquier rival ya sabe qué tiene que hacer exactamente para llegar a donde está R. Julia corre sobre LLVM. Es decir, que se beneficia automáticamente de cualquier mejora realizada sobre la máquina virtual (si es que se me permite llamar así a LLVM). Esta semana he estado programando en C unas rutinas que tienen que ser llamadas desde R. Pero, ¿no sería el mundo más hermoso no tener que cambiar de lenguaje para tener rendimiento de C? Arriba comparo R y Julia como extremos de un arco (en el que a la izquierda de R quedan aún irrelevancias como SAS o SPSS). Python ocupa una posición intermedia entre ambos. Desde un punto de vista meramente técnico, si alguna dimensión es Python mejor que R, Julia es todavía mejor que Python. Salvo, de nuevo, la cantidad de flecos y cascabeles de los que ya dispone Python y que todavía no están presentes en Julia. Pero, como se ha dicho arriba, desde la perspectiva del larguísimo plazo, es una objeción irrelevante que apunta a un estado transitorio de las cosas. Y supongo que podría seguir. ...

14 de julio de 2021 · Carlos J. Gil Bellosta

¿Modelos para ordenar datos?

Ayer leí este resumen de este artículo que propone y discute un algoritmo novedoso y basado en ciencia de datos para ordenar datos y hacerle la competencia a quicksort y demás. Reza y promete: The results show that our approach yields an average 3.38x performance improvement over C++ STL sort, which is an optimized Quicksort hybrid, 1.49x improvement over sequential Radix Sort, and 5.54x improvement over a C++ implementation of Timsort, which is the default sorting function for Java and Python. ...

22 de octubre de 2020 · Carlos J. Gil Bellosta

Una guía (breve, concisa) para crear código (y proyectos) reproducibles

Está aquí y creo que no se le puede quitar ni poner una coma. Es particularmente oportuna porque trata todas esas cosas que nunca se enseñan y que la mucha gente, en el peor de los casos, malaprende.

30 de septiembre de 2020 · Carlos J. Gil Bellosta

Escalabilidad (y estructuras cooperativas)

Esta entrada es una breve nota (en parte, para mí) sobre On the Scalability of Cooperative Structures, un artículo sobre lo que el título indica (sí, que existen estructuras cooperativas como, p.e., las cooperativas o determinados sistemas políticos defendidos desde ciertas posiciones ideológicas, que tienen muy serios problemas de escalabilidad) y que a pesar de su interés no cabría en estas páginas si no fuese por este parrafito: What I would like to do, instead, is introduce a concept to the discussion that I believe has the potential to elucidate several aspects in an extremely helpful way. The concept is that of “scalability.” It is drawn from the computer science literature, and it refers rather generally to the capacity of a system to take on increased workload by integrating additional resources (i.e. to “scale up”) without suffering degradation of performance. ...

22 de junio de 2020 · Carlos J. Gil Bellosta

x[] <- lapply(...)

Estos días he aprendido una expresión muy compacta para operar sobre las columnas de una tabla en R: x <- iris # por ejemplo x[] <- lapply(x, function(x) factor(x)) # o cualquier otra función Aunque lapply debería devolver (y, de hecho, devuelve) una lista, esos corchetes de x fuerzan de una manera contraintuitiva que la salida final sea una tabla. La magia es consecuencia de que [<- es una función en sí misma (puedes consultar help("[<-") si quieres) con un comportamiento que es el que es (porque sí, a veces las cosas son simplemente como son). ...

29 de enero de 2020 · Carlos J. Gil Bellosta

De texto a función

Problema: convertir una expresión definida por un usuario (p.e., algo como "a+b") en una función (i.e., function(a, b) a + b). Solución: gen_foo <- function(expr){ my_args <- all.vars(parse(text = expr)) expr <- paste0("function(", paste(my_args, collapse = ","), ") ", expr) eval(parse(text = expr)) } Demostración: multiplica <- gen_foo("a * b") multiplica(5, 31)

21 de enero de 2020 · Carlos J. Gil Bellosta

BLAS, eficiencia y lme4

Cada cierto número de años me reencuentro con la cuestión de BLAS, ATLAS y todas esas cosas por tratar de arañar un poco de eficiencia a R. Existen el BLAS de toda la vida que, parece ser, viene de serie con R y uno puede optar por otras versiones optimizadas como ATLAS u OpenBLAS, cuyas ventajas relativas, de acuerdo con estos benchmarks, no parecen demasiado claras. Lo novedoso en esta revisita al problema es que he aprendido que a los anteriores se han sumado en estos últimos años, cuando menos: ...

2 de octubre de 2019 · Carlos J. Gil Bellosta

Todo lo que deberías saber sobre encodings

¿Por qué (casi) nadie sabe sobre encodings? ¿Por qué (casi) nadie ha leído What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text?

20 de febrero de 2019 · Carlos J. Gil Bellosta

Modas y fotogenia del código secuencial

Este tipo de programación se puso de moda en los noventa: Y yo decía: ¿dónde están mis bucles? ¿Y mis bifurcaciones? Este tipo de programación está de moda últimamente: hourly_delay <- flights %>% filter(!is.na(dep_delay)) %>% group_by(date, hour) %>% summarise( delay = mean(dep_delay), n = n() ) %>% filter(n > 10) Y todo bien, sí, pero sigo sin tener bucles o bifurcaciones. Tal vez no hagan falta. Al menos, para cosas de andar por casa. Pero, lo confieso, el código de verdad que escribo está lleno de casos especiales, comprobaciones de todo tipo de contingencias, reglas que aplican a unas columnas sí y otras no, objetos complejos (p.e., listas), que se van rellenando de una u otra manera dependiendo de las opciones del usuario y otras enojosas coyunturas muy reñidas con la elegancia. ...

14 de febrero de 2019 · Carlos J. Gil Bellosta

Cerebros "hackeados"

Tengo delante Los cerebros ‘hackeados’ votan de Harari, autor de cierta y reciente fama. Elabora sobre un argumento simple y manido: el cerebro funciona como un ordenador y los seres humanos somos no solo perfectamente predecibles sino también perfectamente manipulables. De lo que se derivan muchas funestas consecuencias en lo político y en lo social. El artículo me ha sido recomendado por dos personas cuyo criterio tengo en muy alta estima. Pero otra lo ha criticado con saña aquí. ...

25 de enero de 2019 · Carlos J. Gil Bellosta