是否有比base::sample
函数更快的方法来进行无重复随机子样本抽取?
通过消除 base::sample 函数调用,您可以获得一些加速:
> x<- rnorm(10000)
> system.time(for(i in 1:100000) x[.Internal(sample(10000L, 10L, FALSE, NULL))])
user system elapsed
2.873 0.017 2.851
> system.time(for(i in 1:100000) sample(x,10))
user system elapsed
3.420 0.025 3.258
根据你的问题,可能有其他更聪明的方法来加速你的代码。考虑用一个大的调用来代替许多小的“sample”调用。dqrng
包解决了 R 中更快的采样问题。
以下是一个示例和基准测试:
library(dqrng)
library(bench)
m <- 1000
n <- 99999
all <- m * n
bm <- bench::mark(samp = sample(x = c(1, -1), size = all, replace = TRUE),
dqsamp = dqsample(x = c(1,-1), size = all, replace = TRUE),
check = FALSE,
iterations = 3)
bm
# # A tibble: 2 x 13
# expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
# <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
# 1 samp 6.37s 6.59s 0.153 1.12GB 0.153 3 3 19.56s
# 2 dqsamp 1.07s 1.43s 0.723 1.12GB 0.482 3 2 4.15s
# # ... with 4 more variables: result <list>, memory <list>, time <list>, gc <list>
这里有一篇相关的博客文章:https://www.r-bloggers.com/2019/04/fast-sampling-support-in-dqrng/。
不行
在我的笔记本电脑上,使用替换方式可以在3毫秒内获取1万个样本。如果不使用替换,则需要5毫秒。从500个分布中多次抽取需要66毫秒。您需要它有多快?
除了使用CUDA/gputools,你不会找到更快的方法。
sample
进行了大量的小调用。 - Aniko