mardi 10 juillet 2012

La compilation sous R

De temps en temps, des informaticiens me tombent dessus en m’assénant que R est bien beau, mais que ça reste un langage interprété, donc notoirement lent. Invariablement je réponds que c’est indéniable, mais que nos programmes représentent la plupart du temps un enchaînement d’appels de fonctions qui, elles, sont compilées (depuis la version 2.14 tout du moins). De fait, les temps de traitements sont très peu grevés par les caractéristiques de l’interpréteur. Avec un peu d’expérience, on se rend compte que R est surtout mal à l’aise lorsque nous implémentons explicitement des boucles (ex. la boucle for). Il faut donc les éviter autant que possible.

J’en étais resté à cette idée lorsque j’ai découvert le package « compiler » de Luke Tierney, inclus dans la distribution standard de R 2.14 . Il serait possible de compiler très simplement un bloc d’instructions intégré dans une fonction. Dans certaines configurations, que l’on s’attachera à déterminer justement, le « byte code » qui en découle se révèlerait nettement plus performant que le code natif passé à la moulinette de l’interpréteur.

Dans ce tutoriel, nous programmons deux traitements classiques de l’analyse de données, (1) avec et (2) sans l’utilisation des boucles : le centrage réduction des variables d’un data frame et le calcul d’une matrice de corrélation par produit matriciel. Dans un premier temps, nous mesurons les temps d’exécution respectifs des versions interprétées. Dans un second temps, nous les compilons avec la fonction « cmpfun » du package compiler, puis nous les évaluons de nouveau.

Nous constatons que le gain en vitesse d’exécution de la version compilée est particulièrement spectaculaire pour les versions avec boucles, il est négligeable en revanche pour les secondes variantes.

Mots clés : package compiler, cmpfun, byte code, package rbenchmark, benchmark
Lien : fr_Tanagra_R_compiler_package.pdf
Programme : compilation_r.zip
Références :
Luke Tierney, "A Byte Code Compiler for R", Department of Statistics and Actuarial Science, University of Iowa, March 30, 2012.
Package 'compiler' - "Byte Code Compiler"