viernes, 14 de julio de 2017

Visual Basic para Aplicaciones contra 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, especialmente 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:
  • Código VBA con bucles
  • Código R con bucles
  • Código 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.

Los tres códigos pueden encontrarse en los archivos codigomandelbrotvba.xlsm, codigomandelbrotr.R y codigomandelbrotrmatricial.R.

Los resultados en velocidad no han podido ser mejores para Visual Basic. 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 tiempos de ejecución en segundos han sido los siguientes:



Aunque duela 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 plenas facilidades para obtener una salida directa en cualquier formato gráfico.

En este enlace 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.


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.