【问题标题】:Speeding up a strangely slow Rcpp function加速一个异常缓慢的 Rcpp 函数
【发布时间】:2015-05-07 23:35:41
【问题描述】:

我想用 Rcpp 重写一个昂贵的 R 函数。由于我是这个主题的新手,所以我尝试了一些非常简单的东西。 我写了以下函数:

Rcpp::cppFunction('
  std::vector<int> test_C(double a) {
    std::vector<int> indices;
    indices.reserve(2);
    indices.push_back(a);
    indices.push_back(a);
    return (indices);
  }
')

现在效果很好。但这需要 0.1 秒(对于这个任务来说这当然太多了)。以前我有

Rcpp::cppFunction('
  NumericVector test_C(double a) {
    NumericVector indices(2);
    indices[0] = a;
    indices[1] = a;
    return (indices);
  }
')

这同样慢。我怀疑这是我的系统故障。我在R: Getting indices of elements in a sorted vector 的答案中尝试了 Rcpp 代码,它计算了数字向量 v(在我的测试中长度为 10e7)和双 a 的 which[v > a][1],它的工作非常非常快。

任何提示我做错了什么?

【问题讨论】:

  • 请同时包含代码的 R 部分。您是否循环并将此函数应用于循环的每个元素?第二个函数在我的系统上运行时间为 1 微秒,这接近于 Rcpp 函数的简单评估时间。
  • 我很好奇你为什么要用doubles 填充一个整数向量。
  • nrussell:哦,对,这没有任何意义。我改变了它,速度没有增加。无论如何,带有 NumericVector 的版本也很慢。
  • 使用microbenchmarkSys.time 对于定时短评估没有用处。另外,计时方式是system.time(expression.to.time)
  • Sys.time 在 Windows 中的最大精度为 0.1 秒,这很可能是您获得“慢”时间的原因。您应该使用适当的基准测试工具,例如 @BrodieG 和 @Dirk Eddelbuettel 建议的工具

标签: r rcpp


【解决方案1】:

你是不是偶然也测量了编译?

R> library(rbenchmark)
R> benchmark(test_C(2))[1:4]
       test replications elapsed relative
1 test_C(2)          100   0.001        1
R> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多