library(Rcpp)

cppFunction('Rcpp::NumericVector sum_vectors_C(NumericVector x, NumericVector y) {
  int n = x.size();

  Rcpp::NumericVector total(x.size());

  for(int i = 0; i < n; ++i) {
    total[i] = x[i] + y[i];
  }
  return total;
}')

x <- runif(100)
y <- runif(100)

sol_C <- sum_vectors_C(x, y)
sol_R <- x + y

identical(sol_C, sol_R)

library(tictoc)

tic('Using Rcpp')
sol_C <- sum_vectors_C(x, y)
toc()

tic('Using base R')
sol_R <- x + y
toc()

tic('Using a loop and prealocation')
sol_loop <- numeric(length = length(x))
for (i in 1:length(x)) {
  sol_loop[i] <- x[i] + y[i]
}
toc()
# none
#my_answers <- make_random_answers(my_sol)
my_answers <- rep(NA, 5)

type_question <- 'string'
ex_name <- 'otimizing 13-03'

Question

Use o pacote tictoc para comparar o desempenho da função anterior com o operador nativo +, e uma versão baseada em loops com pré-alocação. Qual alternativa apresenta menor tempo de execução e por quê? A versão Rcpp vence a versão em loop?

Solution

A melhor alternativa é o operador nativo +. Este já é otimizado e executa o cálculo rapidamente.


Meta-information

extype: r type_question exsolution: r mchoice2string(c(TRUE, FALSE, FALSE, FALSE, FALSE), single = TRUE) exname: r ex_name exshuffle: TRUE



msperlin/adfeR documentation built on March 26, 2021, 3:05 a.m.