【问题标题】:R loop for calculating matrix elements taking too long to execute用于计算矩阵元素的 R 循环执行时间过长
【发布时间】:2011-04-16 21:45:33
【问题描述】:

以下循环需要很长时间才能运行。如果我评论里面的行,它会运行得很快。 prices3224x40 矩阵。

get_returns <- function(prices, type=1) {  
  returns = prices
  returns2 = prices
  returns[,] = 0
  M = dim(prices)[1]
  N = dim(prices)[2]

  for (i in 2:M) {
    for (j in 1:N) {      
      returns[i,j] = prices[i,j]/prices[i-1,j] - 1   ## LINE 1
      returns2[i,j] = prices[i,j]/prices[1,j] - 1   ## LINE 1
    }
  }
}

> dim(prices)
[1] 3224   40

>
> system.time(get_returns(prices,1))
   user  system elapsed 
1213.95    1.12 1266.60 
> 

> # After commenting LINE 1
> system.time(get_returns(prices,1))
   user  system elapsed 
   0.67    0.00    0.75 
>

运行大约需要 20 分钟。我想知道为什么要花这么长时间才能运行,如果我能做些什么来优化它。我还有其他运行得相当快的循环,但这个特定的循环是个问题。

【问题讨论】:

  • @user236215 :您的运行时简直太疯狂了。确定价格是一个矩阵?
  • 是的,它是一个矩阵。您可能可以使用随机值设置一个类似的矩阵并注意这一点。
  • @user236215 : 在我的电脑上,这个运行时间为 1.2 秒... (system.time(test &lt;- get_returns(prices = matrix(runif(3224*40), ncol = 40))) )
  • 我得到了相同的结果(1.22 秒)。
  • 我得到了 0.58。我还发现 get_returns 需要 return(returns) 才能返回任何值。

标签: r optimization


【解决方案1】:

循环在 R 中花费的时间太长。您需要利用矢量化。例如,代替你的循环,试试这个:

returns <- prices[2:M,]/prices[1:(M-1),] -1;

另请参阅R inferno 中的信息。

【讨论】:

  • 哇。这几乎立即运行。这份文件真的很有启发性。谢谢!
  • 您将如何使用矢量化更改返回2(已编辑的原始帖子)?当我执行returns2 &lt;- prices[2:M,]/prices[1,] -1 时,我收到错误“Ops.data.frame 中的错误(prices[2:M, ], prices[1, ]) : / only defined for equal-sized data frames”
  • 你可以试试w=dim(prices)[2]; returns2 &lt;- prices[2:M,]/matrix(prices[1,]-1, M-1, w); 基本上你用prices[1,] 制作一个与prices[2:M,] 大小相同的矩阵。但这需要一点内存。
【解决方案2】:

如果价格是 data.frame

sapply(prices,diff)/prices[-nrow(prices_df),]

如果价格是矩阵

apply(prices,2,diff)/prices[-NROW(prices),]

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多