如何在 Rcpp 中加快 xts 数据到 Datetime Vector 的转换?

How to speedup the xts data conversion to DatatimeVector in Rcpp?

我正在使用 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 微秒。 有什么方法可以更好地优化转换或完全避免转换。

您最好只使用具有适当 class 属性的 NumericVector。这是我几周前使用的一个快速一次性函数 in another project:

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 自纪元以来。这里我们从另一个 API 得到了一个 std::vector<double>,所以转换非常便宜。