0

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

4

1 回答 1

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])
}))
于 2015-05-30T00:11:19.623 回答