20 juillet 2018
En général on utilise du C++ au lieu de R dans les cas suivant :
R possède des atouts non négligeables :
Par exemple si on veut exécuter n fois la fonction : \[ x \mapsto \frac{1}{1+x}\]
f <- function(n, x=1) for (i in 1:n) x=1/(1+x) g <- function(n, x=1) for (i in 1:n) x=(1/(1+x)) h <- function(n, x=1) for (i in 1:n) x=(1+x)^(-1) j <- function(n, x=1) for (i in 1:n) x={1/{1+x}} k <- function(n, x=1) for (i in 1:n) x=1/{1+x}
Parmi toute ces écritures laquelle est la plus rapide?
library(rbenchmark) N <- 1e6 benchmark(f(N,1), g(N,1), h(N,1), j(N,1),k(N,1),columns=c("test", "replications", "elapsed", "relative"), order="relative", replications=10)
## test replications elapsed relative ## 4 j(N, 1) 10 0.395 1.000 ## 1 f(N, 1) 10 0.398 1.008 ## 2 g(N, 1) 10 0.400 1.013 ## 5 k(N, 1) 10 0.401 1.015 ## 3 h(N, 1) 10 0.450 1.139
library(inline) src <- 'int n = as<int>(ns); double x = as<double>(xs); for (int i=0; i<n; i++) x=1/(1+x); return wrap(x); ' l <- cxxfunction(signature(ns="integer", xs="numeric"), body=src, plugin="Rcpp")
On reviendra plus tard sur ces lignes..
N <- 1e6 benchmark(f(N,1), g(N,1), h(N,1), j(N,1),k(N,1),l(N,1),columns=c("test", "replications", "elapsed", "relative"), order="relative", replications=10)
## test replications elapsed relative ## 6 l(N, 1) 10 0.074 1.000 ## 4 j(N, 1) 10 0.392 5.297 ## 5 k(N, 1) 10 0.392 5.297 ## 1 f(N, 1) 10 0.393 5.311 ## 2 g(N, 1) 10 0.407 5.500 ## 3 h(N, 1) 10 0.452 6.108