R распараллелить цикл for при чтении данных из списка

У меня есть цикл for, который я хотел бы запустить параллельно с R. Следующий цикл проходит через каждый продукт в базе данных, используя index m (всего у меня есть M продуктов для оценки). Я передаю в качестве входных данных для своей функции ценообразования исходную цену (это числовое значение) и ставку дисконтирования, которая считывается из списка (поэтому мне нужно извлечь это значение, используя функцию [[]] formulation.

for(m in 1:M)
{ 
  myList[paste0("Product", m)] <- list(priceProduct(originalPrice, discounts[[m]])) 
}

Этот цикл работает нормально, и в конце у меня есть список myList, содержащий правильные цены со скидкой для каждого продукта. В myList есть все элементы с именами ProductX, где X — это позиция продукта в моей исходной базе данных (которая в цикле является счетчиком m). Единственная проблема в том, что он работает ужасно медленно, поэтому мне было интересно, как это распараллелить. Любое предложение?


person opt    schedule 29.05.2015    source источник
comment
Возможно, вам пригодится пакет foreach: cran.r-project.org /web/packages/foreach/vignettes/foreach.pdf   -  person Josh W.    schedule 30.05.2015


Ответы (1)


Сначала векторизуйте свой код, прежде чем беспокоиться о параллельной обработке. Код R обычно векторизован, но параллельная обработка все еще требует дополнительной работы. Пакеты foreach и Rcpp (если вы знаете C++) также могут сделать работу еще более быстрой. Или вы можете попытать счастья с Джулией, которая работает быстро, хотя и не так зрело. Однако для большинства повседневных задач векторизация помогает.

Ответ на ваш вопрос немного зависит от специфики структуры ваших данных и функций. Нижеследующее делает несколько расплывчатых предположений, но вы должны быть в состоянии адаптировать его к своим особенностям. (Или просто добавьте больше деталей, а я вернусь и отредактирую.)

# Let's say:
m <- 100

# `paste` functions can accept a sequence, and are easy to vectorize
product <- paste0("Product", 1:m)

# Let's chuck everything in a `data.frame` to stay organized:
data <- data.frame(product, originalPrice, discount)

# If `priceProduct` accepts vector arguments:
data$salePrice <- priceProduct(data$originalPrice, data$discount)

# If not:
data$salePrice <- sapply(seq(1, nrow(data)), function(x){
    priceProduct(data$originalPrice[x], data$discounts[x])
})

# If it spits out a list, more cleaning is in order:
data$salePrice <- do.call(c, 
    sapply(seq(1, nrow(data)), function(x){
        priceProduct(data$originalPrice[x], data$discounts[x])
}))
person alistaire    schedule 30.05.2015