Je suis nouveau à Rcpp et explore ses applications. En particulier, je suis en train d'accélérer la fonction suivante, en partie construite sur un previous answer:Rcpp - accélérer les tirages normaux aléatoires dans et pendant la boucle
code = 'NumericVector RcppFun(int N){
NumericVector out(N);
for (int i = 0; i < N; ++i) {
double V = 0;
while(V > -1e04 && V < 1e04) {
V += R::rnorm(10, 100);
}
out[i] = V;
}
return out;
}'
cppFunction(code)
system.time(RcppFun(1e05))
Le code est nettement plus rapide que son homologue de R, mais nécessite encore quelques secondes pour courir sur mon ordinateur. Étant donné que j'ai besoin d'appeler cette fonction plusieurs fois, je me demandais si je pouvais encore améliorer ses performances. Je pensais que modifier la déclaration logique dans la boucle while ou changer la fonction RNG rendrait la fonction plus rapide, mais je ne pouvais pas comprendre comment.
Merci pour votre suggestion!
EDIT: juste pour être complet, voici le code que j'ai écrit en C++ basé sur la suggestion très utile de Dirk:
#include <Rcpp.h>
// [[Rcpp::depends(RcppZiggurat)]]
#include <Ziggurat.h>
using namespace Rcpp;
static Ziggurat::Ziggurat::Ziggurat zigg;
// [[Rcpp::export]]
NumericVector ZiggFun(int N){
NumericVector out(N);
for (int i = 0; i < N; ++i) {
double V = 0;
while(V > -1e04 && V < 1e04) {
V += 10 + zigg.norm()*100;
}
out[i] = V;
}
return out;
}
Sur la base des estimations rbenchmark :: référence, le nouveau code est maintenant plus de 7 fois plus vite!