package CRAN plus rapide ?

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

package CRAN plus rapide ?

Messagepar Stéphane Laurent » 20 Avr 2017, 20:46

Bonjour,

Voilà mon histoire. J'ai écrit une fonction qui effectue le même calcul que la fonction d'un package CRAN que j'ai installé, en espérant que la mienne serait plus performante (notamment ma fonction fait moins de if dans des boucles). Mais les comparaisons (avec microbenchmark) montrent que la fonction du package CRAN peut aller 5 fois plus vite que la mienne.
J'ai fait un package pour ma fonction, que je construis dans RStudio avec les options par défaut. Après m'être arraché les cheveux à n'y rien comprendre, j'ai finalement pris le code de la fonction du package CRAN et je l'ai mis dans mon package. Je n'y croyais pas et pourtant là, quand je compare les deux fonctions de mon package, la mienne est effectivement plus rapide que la fonction que j'ai copiée verbatim.
Du coup je me demande : est-ce qu'un package gagne de la performance quand il est construit sur CRAN ? Est-ce une option de R CMD qui permet d'optimiser le package ?

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: package CRAN plus rapide ?

Messagepar Eric Wajnberg » 21 Avr 2017, 07:18

Juste une idée, rapide : Et la fonction du package sur CRAN n'est-elle pas simplement compilée, ce qui expliquerait sa plus grande rapidité d'exécution ?

Eric.

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Re: package CRAN plus rapide ?

Messagepar Stéphane Laurent » 21 Avr 2017, 08:35

Bonjour,
J'ai déjà entendu parler de ça, mais je n'ai pas trop compris. Qu'est-ce exactement, comment on fait ça ? J'ai fait des recherches hier, j'ai trouvé des slides qui parlaient de Ra (est-ce une autre version de R ?) et du package jit.
Le code source du package est sur Github, je peux y voir si la fonction est compilée, ou la compilation se passe sur CRAN ?
Je suis bien curieux d'en apprendre plus sur cette histoire de compilation...

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: package CRAN plus rapide ?

Messagepar Michaël Delorme » 21 Avr 2017, 10:22

Dans le fichier DESCRIPTION du package, on peut indiquer :

Code : Tout sélectionner

ByteCompile: true

Ce qui permet une compilation lors de l'installation.

Plus généralement tu peux utiliser le package compiler :

Code : Tout sélectionner

library(compiler)
library(microbenchmark)

mafonction <- function(n = 100000) {
  k <- 0
  for(i in 1:n) {
    k <- k + i
  }
  k
}

mafonctioncompilee <- cmpfun(mafonction)


microbenchmark(times = 10, unit = "s",
               mafonction(),
               mafonctioncompilee())


On a par exemple ici un gain de 15x :

Code : Tout sélectionner

microbenchmark(times = 10, unit = "s",
               mafonction(),
               mafonctioncompilee())

Unit: seconds
                 expr         min          lq        mean      median          uq         max neval
         mafonction() 0.027005598 0.027887728 0.028603676 0.028652379 0.028948026 0.030900969    10
 mafonctioncompilee() 0.001893454 0.001932814 0.001989389 0.001945281 0.002006724 0.002293357    10

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: package CRAN plus rapide ?

Messagepar Eric Casellas » 21 Avr 2017, 11:02

Stéphane Laurent a écrit : je peux y voir si la fonction est compilée, ou la compilation se passe sur CRAN ?
Je suis bien curieux d'en apprendre plus sur cette histoire de compilation...


Bonjour,

sur cet aspect de compilation des paquets R, il y a différentes possibilités, je ne suis pas spécialiste (du coup corrigez moi si je me trompe) mais voici quelques notions générales.
Sous windows par défaut l'installation des paquets R se fait en mode "binaire" ce qui peut correspondre à une compilation sur les serveur du CRAN (avec leur compilateur et ses options éventuelles). Il reste toutefois possible de faire l'installation à partir des sources et à ce moment la compilation se fait sur ta machine (avec le compilateur et ses options) (je ne saurais pas dire quelles sont les options par défaut ni si elles diffèrent de celles utilisé sur le CRAN). Sous unix on à en général accès qu'à la version source car ça demande trop de boulot de maintenir pour toutes les versions (en particulier il peut y avoir des soucis pour pouvoir faire des liens dynamiques ou alors faudrait passer par du statique qui pose d'autres problèmes par ailleurs.)
Et sinon pour la question des performances (temps de calcul et/ou utilisation de la mémoire), en fonction des compilateurs certaines options peuvent avoir de gros effets...

Eric
Eric

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Re: package CRAN plus rapide ?

Messagepar Stéphane Laurent » 21 Avr 2017, 11:11

Ah oui en effet:

Code : Tout sélectionner

> packageDescription("PowerTOST")
Package: PowerTOST
......
ByteCompile: yes


C'est donc ça !

Merci à vous !

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: package CRAN plus rapide ?

Messagepar Michaël Delorme » 21 Avr 2017, 11:22

Eric Casellas a écrit :Sous windows par défaut l'installation des paquets R se fait en mode "binaire" ce qui peut correspondre à une compilation sur les serveur du CRAN (avec leur compilateur et ses options éventuelles). Il reste toutefois possible de faire l'installation à partir des sources et à ce moment la compilation se fait sur ta machine (avec le compilateur et ses options) (je ne saurais pas dire quelles sont les options par défaut ni si elles diffèrent de celles utilisé sur le CRAN). Sous unix on à en général accès qu'à la version source car ça demande trop de boulot de maintenir pour toutes les versions (en particulier il peut y avoir des soucis pour pouvoir faire des liens dynamiques ou alors faudrait passer par du statique qui pose d'autres problèmes par ailleurs.)
Eric


En fait ce dont on parle ici n'est pas une compilation "classique" qui correspond comme tu l'évoques ci-dessus à des portions de packages écrites en C ou autres qui sont compilées à l'installation (sous Linux/Unix) ou précompilées (windows) pour avoir du code binaire directement utilisable par le processeur ; il s'agit de créer pour du code R un code intermédiaire (bytecode) plus performant que le code R (interprété).

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: package CRAN plus rapide ?

Messagepar Michaël Delorme » 24 Avr 2017, 09:35

Et puisqu'on en parle, la version 3.4.0 de R qui vient juste de sortir compile désormais les fonctions et les boucles par défaut (même en dehors d'un package)...

https://stat.ethz.ch/pipermail/r-announce/2017/000612.html

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Re: package CRAN plus rapide ?

Messagepar Stéphane Laurent » 14 Juil 2017, 17:53

Et ByteCompile ne sert plus à rien avec R 3.4 (je viens de tester).


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité