是否有比base::sample函数更快的方法来获取随机子样本(无需替换)?
base::sample
hzbexzde1#
没有我可以在3毫秒内在我的笔记本电脑上获得10,000个样本。没有替换,我可以在5 ms内得到它们。从500个分布中多次绘制需要66毫秒。你需要它多快?
11dmarpk2#
你可以通过消除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
根据您的问题,可能有其他更聪明的方法来加速代码。想办法用一个大的调用来代替许多小的调用。
avwztpqn3#
dqrng包解决了R中更快的采样问题。下面是一个示例和基准测试(注意,我已经更新了这些基准测试,以解决Ralf在下面的评论):
dqrng
library(dqrng) library(bench) library(ggplot2) set.seed(892) dqset.seed(871) 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), dqrrademacher = dqrrademacher(n), check = FALSE, iterations = 3) bm plot(bm) + theme_bw()
dqrng要快得多-注意x轴是对数刻度的!以下是相关的博客:https://www.r-bloggers.com/2019/04/fast-sampling-support-in-dqrng/。
3条答案
按热度按时间hzbexzde1#
没有
我可以在3毫秒内在我的笔记本电脑上获得10,000个样本。没有替换,我可以在5 ms内得到它们。从500个分布中多次绘制需要66毫秒。你需要它多快?
11dmarpk2#
你可以通过消除base::sample函数调用来获得一点加速:
根据您的问题,可能有其他更聪明的方法来加速代码。想办法用一个大的调用来代替许多小的调用。
avwztpqn3#
dqrng
包解决了R中更快的采样问题。下面是一个示例和基准测试(注意,我已经更新了这些基准测试,以解决Ralf在下面的评论):dqrng
要快得多-注意x轴是对数刻度的!以下是相关的博客:https://www.r-bloggers.com/2019/04/fast-sampling-support-in-dqrng/。