当从列表中读取数据时,R并行化for循环

时间:2015-05-29 22:38:47

标签: r performance for-loop parallel-processing parallel-foreach

我有一个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)。 唯一的问题是运行起来非常慢,所以我想知道如何并行化这个。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在担心并行处理之前先将代码矢量化。 R代码通常是矢量化的,但并行处理仍然需要更多的工作。 foreachRcpp(如果您了解C ++)包也可以使事情变得更加简单。或者你可以试试Julia的运气,虽然不够成熟但速度很快。但是,对于大多数日常工作来说,矢量化可以解决这个问题。

您的问题的答案取决于您的数据和功能的结构具体细节。以下是一些宽松的假设,但您应该能够根据您的具体情况进行调整。 (或者只是添加更多细节,我会回来编辑。)

# 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])
}))