如何将while循环并行化?

3
iter <- 1000
myvec <- c()
while(is.null(myvec) || nrow(myvec) <= iter){
 x = rnorm(10, mean = 0, sd = 1)
 if(sum(x) > 2.5){
    myvec <- rbind(myvec, x)
 }
}

我想并行化上面的while循环,直到myvec中共有iter = 1000条目为止。我查看了这篇帖子,但我认为那里的答案不适用于我的示例。


3
第四行应该是sd = 1而不是sigma = 1吗? - jpdugo17
2
这个循环在R中相当难以有效地并行化,因为循环条件中存在数据依赖关系,但您可以通过以下方法使现有代码更加高效:(a) 不要重复调用'rbind',这会使您的算法渐近较慢;(b) 生成较大的正态分布随机数矩阵,并找到第一行不再满足条件的位置。然后切断剩余的行。 - Konrad Rudolph
1个回答

4

实际上您不需要并行化while循环。 您可以像下面这样将操作向量化到x

iter <- 1000
myvec <- c()
while (is.null(myvec) || nrow(myvec) <= iter) {
  x <- matrix(rnorm(iter * 10, mean = 0, sd = 1), ncol = 10)
  myvec <- rbind(myvec, subset(x, rowSums(x) > 2.5))
}
myvec <- head(myvec, iter)

或者
iter <- 1000
myvec <- list()
nl <- 0
while (nl < iter) {
  x <- matrix(rnorm(iter * 10, mean = 0, sd = 1), ncol = 10)
  v <- subset(x, rowSums(x) > 2.5)
  nl <- nl + nrow(v)
  myvec[[length(myvec) + 1]] <- v
}
myvec <- head(do.call(rbind, myvec), iter)

我相信,即使您有大量的iter,这种方法也会更快。


使用future有什么贡献?该值不是(也不能!)懒惰计算的。而且,无论如何,计算“x”的值并不是这里的缓慢部分 - 重复的“rbind”是。使用您的解决方案(减去未来),这个问题得到了解决。 - Konrad Rudolph
2
@KonradRudolph 我认为 future 不是必要的,也不能够提高速度太多。我只是把它放在这里,以防 OP 不知道如何将链接中现有的答案重写为针对这个特定问题的答案。无论如何,我提供了另一个基于 R 的选项,速度要快得多。 - ThomasIsCoding
2
未来的作者在此: 在代码中使用 future ,例如 myvec[[k]] %<-% x, 会将 在主 R 会话中计算出的 x 的值 导出到并行工作进程,然后返回其值。请注意,它 不会 并行执行任何计算。因此,这种方式不起作用。它实际上相当于 myvec[[k]] <- x,但效率要低得多。建议您删除 future 示例代码,以便以后没有人认为是这样实现的。 - HenrikB
2
@HenrikB 感谢您的评论。我同意删除带有 future 的答案 :) - ThomasIsCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接