viernes, 14 de julio de 2017

Visual Basic para Aplicaciones vs R

Siempre he tenido la sensación de que pese a ser un lenguaje interpretado, el código Visual Basic para Aplicaciones (VBA) corre como un demonio, sobre todo a la hora de ejecutar bucles. Por otro lado es sabido que el lenguaje R, de orientación estadística y también interpretado, es especialmente poco eficiente a la hora de ejecutar sentencias anidadas, siendo con él lo óptimo vectorizar el código todo lo posible.

He hecho una pequeña prueba en la que he enfrentado los dos lenguajes en la obtención del conocido conjunto de Mandelbrot, consistente en bucles iterativos con cálculos numéricos de por medio, y que ya usamos como ejemplo en el artículo 'Gráficos de mapa de bits en Excel'.



Se ha generado el set Mandelbrot de tres formas posibles:
  • VBA con bucles
  • R con bucles
  • R matricial y usando notación compleja (fuente: R-bloggers)

A continuación se muestra el código VBA basado en bucles (la versión R es totalmente equivalente):



Y éste es el código R en formato matricial y aprovechando el tipo de datos complejo del lenguaje:



Puede verse como desaparecen los dos bucles que recorrían cada píxel de la imagen final a formar, quedando un solo bucle que opera según la iteración en curso, seleccionado de la matriz compleja completa solo los índices (posiciones) que deben seguir iterándose.

Corriendo sobre el mismo PC y para un límite de 100 iteraciones por píxel en la construcción del gráfico general Mandelbrot en formato Full HD (1.920x1.080 píxeles), los resultados no han podido ser mejores para Visual Basic.



Aunque cueste admitirlo, R no ha sido rival en potencia de cálculo para Visual Basic, ni siquiera en esta modalidad interpretada que incluye el paquete MS Office. VBA ha ejecutado los bucles casi 34 veces más rápido que R, y 7 veces más rápido que la versión optimizada en R con matrices y notación compleja.

También hay que decir que pese a su lentitud relativa, R es perfectamente válido para obtener en tiempos asequibles imágenes del conjunto Mandelbrot con un número elevado de iteraciones y muy alta definición, dando facilidades para obtener una salida directa en formato gráfico.

Aquí puede verse la versión completa en Full HD de la imagen del encabezado, obtenida con el código optimizado R y un límite de 5.000 iteraciones por píxel. Los colores se han generado aplicando curvas en Photoshop.

~~~

Repositorio con el código R y archivos auxiliares: GitHub.

No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.