La conversión de matrices R a armadillo es realmente lenta
Una observación
Para matrices de tamaño mediano, los gastos generales al pasar matrices de R a C ++ son masivamente más lentos paraarma::mat
tipos que paraNumericMatrix
tipos. Como tomar alrededor de 250 veces más. Aquí hay un ejemplo mínimo
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
double test_nm( NumericMatrix X ) {
return 0.0 ;
}
// [[Rcpp::export]]
double test_arma( mat X ) {
return 0.0 ;
}
// [[Rcpp::export]]
double test_nm_conv( NumericMatrix X ) {
mat X_arma = as<mat>( X ) ;
return 0.0 ;
}
Entonces, en R:
XX <- matrix( runif( 10000 ), 2000, 50 )
microbenchmark( test_nm( XX ), test_arma( XX ), ( XX ) )
Unit: microseconds
expr min lq mean median uq max neval
test_nm(XX) 5.541 16.154 16.0781 17.577 18.876 48.024 100
test_arma(XX) 1280.946 1337.706 1404.0824 1361.237 1389.476 3385.868 100
test_nm_conv(XX) 1277.417 1338.835 1393.4888 1358.128 1386.101 4355.533 100
Entonces, simplemente pasando una matriz comoarma::mat
el tipo es aproximadamente 250 veces más lento queNumericMatrix
. Eso es una locura! Entonces...
Preguntas que surgen
¿Que esta pasando? Por que esmat
entonces mucho más lento queNumericMatrix
?¿Hay una buena manera de lidiar con esto? Tengo un problema donde necesito usar unarma::mat
para algunos álgebra matricial bastante simple en una función que se llama muchas veces. Actualmente estoy usandoarma
tipos en todo momento, y mi código esmucho más lento de lo que esperaba (así es como terminé cocinando los ejemplos tontos anteriores). Una penalización de velocidad de 250x es tan importante que estoy a punto de reescribir grandes secciones de código para usarNumericMatrix
tipos en todo. De hecho, podría terminar escribiendo mi propia función de multiplicación de matrices paraNumericMatrix
y abandonararma
tipos por completo. Pero antes de hacerlo, ¿hay alguna solución mejor?(Aunque supongo que otra forma de leer esto no es esoarma::mat
es lento para convertir de tipos R, pero que elNumericMatrix
¡el tipo es increíblemente eficiente!)