Я использую Rcpp для анализа данных XTS и получаю его временной индекс, используя следующий код rcpp:
#include <Rcpp.h>
using namespace Rcpp;
using namespace std;
// [[Rcpp::export]]
DatetimeVector xtsIndex(NumericMatrix X)
{
DatetimeVector v(NumericVector(X.attr("index")));
return v;
}
DatetimeVector tmpindexDaily = xtsIndex(askDailymat); // Get xts index to Rcpp vector
Оказывается, что это преобразование занимает 2 мс для выполнения с определенным набором данных, где мне нужен только индекс времени, без этого кода это занимает менее 100 микросекунд.
Есть ли способ лучше оптимизировать конверсию или полностью ее избежать.
Вы можете быть лучше, просто используя NumericVector
с надлежащим атрибутом класса. Вот быстрая разовая функция, которую я использовал несколько недель назад в другом проекте:
Rcpp::NumericVector createPOSIXtVector(const std::vector<double> & ticks,
const std::string tz) {
Rcpp::NumericVector pt(ticks.begin(), ticks.end());
pt.attr("class") = Rcpp::CharacterVector::create("POSIXct", "POSIXt");
pt.attr("tzone") = tz;
return pt;
}
Вы можете начать аналогичным образом из других контейнеров, столбцов матрицы, векторов, … которые могут содержать double
ценности и использовать тот факт, что время (POSIXct
) время действительно дробное double
с эпохи. Здесь мы получили std::vector<double>
из другого API, поэтому преобразование довольно дешево.