Является ли mclapply () с mc.cores = 1 такой же, как lapply ()? - PullRequest
0 голосов
/ 26 июня 2018

Я знаю, что не должен вкладывать параллельные операторы, но я нахожусь в ситуации, когда мне приходится в основном вкладывать два вызова mclapply() в мой код. Это потому, что в моем коде у меня есть функция (назовем ее foo()), которая уже использует mclapply() внутри нее. В основном я хочу запускать параллельные потоки последовательной версии foo(), делая что-то вроде этого:

mclapply(X, function(x) {
  foo(x, mc.cores = 1)
},
mc.cores = 4)

Могу ли я просто запустить внутренний mclapply() с mc.cores = 1 или мне следует реализовать последовательную версию foo()?

Другими словами: mclapply(..., mc.cores = 1) ведет себя точно так же, как lapply(...)? Есть ли параллельные издержки, замедляющие программу в этом случае?

1 Ответ

0 голосов
/ 26 июня 2018

Исходный код parallel::mclapply содержит этот бит кода:

 ... 
 if (cores < 2L) 
        return(lapply(X = X, FUN = FUN, ...))
 ... 

Так что я считаю, что ответ - да, вы должны получить те же результаты, что и при использовании lapply напрямую, но есть и некоторые дополнительные издержки. Я сомневаюсь, что это очень сильно повлияет на время выполнения.

В документации также указано, что:

Подробнее

mclapply - это параллельная версия lapply, при условии, что mc.cores> 1: для mc.cores == 1 он просто вызывает lapply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...