用于计算矩阵元素的R循环执行时间太长

时间:2011-04-06 07:16:41

标签: r optimization

以下循环需要花费大量时间才能运行。如果我对内线进行评论,它会很快运行。 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分钟才能运行。我想知道为什么要花这么长时间才能运行,如果我可以做一些事情来优化它。我有其他循环运行得相当快,但这个特殊的循环是一个问题。

2 个答案:

答案 0 :(得分:4)

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

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

另请参阅R inferno

中的信息

答案 1 :(得分:0)

如果价格是data.frame

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

如果价格是矩阵

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