在为已经聚合的数据创建一些采样函数的过程中,我发现表格在我正在使用的大小数据上相当慢.我尝试了两个改进,首先是Rcpp函数,如下所示
// [[Rcpp::export]]
IntegerVector getcts(NumericVector x, int m) {
IntegerVector cts(m);
int t;
for (int i = 0; i < x.length(); i++) {
t = x[i] - 1;
if (0 <= t && t < m)
cts[t]++;
}
return cts;
}
Run Code Online (Sandbox Code Playgroud)
然后在试图理解为什么表格相当慢的时候,我发现它基于制表.Tabulate对我来说效果很好,并且比Rcpp版本更快.制表的代码位于:
https://github.com/wch/r-source/blob/545d365bd0485e5f0913a7d609c2c21d1f43145a/src/main/util.c#L2204
关键是:
for(R_xlen_t i = 0 ; i < n ; i++)
if (x[i] != NA_INTEGER && x[i] > 0 && x[i] <= nb) y[x[i] - 1]++;
Run Code Online (Sandbox Code Playgroud)
现在制表和我的Rcpp版本的关键部分看起来非常接近(我没有打扰过NA).
Q1:为什么我的Rcpp版本慢了3倍?
Q2:我怎样才能知道这个时间到了哪里?
我非常感谢知道时间的去向,但更好的方法是分析代码.我的C++技能只是如此,但这似乎很简单,我应该(交叉我的手指)能够避免任何会使我的时间增加三倍的愚蠢的东西.
我的时间码:
max_x <- 100
xs <- sample(seq(max_x), …Run Code Online (Sandbox Code Playgroud) 我有这个数据...
Scientificname Level Zone levelmean
<chr> <int> <chr> <dbl>
1 Acanthostracion polygonius 3 B 0.135
2 Acanthostracion quadricornis 1 B 0.286
3 Acanthostracion quadricornis 1 D 0.228
4 Acanthostracion quadricornis 2 B 0.212
5 Acanthostracion quadricornis 2 D 0.181
6 Acanthostracion quadricornis 3 B 0.247
7 Acanthostracion quadricornis 3 D 0.222
8 Acanthostracion quadricornis 4 B 0.151
9 Acanthostracion quadricornis 4 D 0.202
10 Acanthostracion spp. 2 B 0.225
11 Achirus lineatus 1 B 0.204
12 Achirus lineatus 1 D …Run Code Online (Sandbox Code Playgroud)