【问题标题】:R parallelize a for loop when reading data from a listR从列表中读取数据时并行化for循环
【发布时间】:2015-05-29 22:38:46
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

在您担心并行处理之前,首先对您的代码进行矢量化处理。 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])
}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2014-04-12
    • 2017-07-01
    • 2023-03-26
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    相关资源
    最近更新 更多