Почему такие большие различия в производительности между R by () и lapply ()? - PullRequest
0 голосов
/ 17 января 2012

У меня есть xts объект, содержащий временные ряды для нескольких биржевых символов.Мне нужно разделить объект xts на подгруппы, специфичные для символов, и обработать данные для каждого символа, а затем собрать все подгруппы в исходной матрице xts, содержащей полный набор строк.Каждый символ представляет собой поле от 1 до 4 символов, которое используется в качестве факторного индекса для разделения матрицы на подгруппы.

Это время, которое сообщается для разделения моей матрицы при вызове by(), lapply() и ddply():

> dim(ets)
[1] 442750     24
> head(ets)
                    Symbol DaySec  ExchTm             LclTm              Open      High      Low       Close     CloseRet       
2011-07-22 09:35:00 "AA"   "34500" "09:34:54.697.094" "09:34:54.697.052" " 158100" " 158400" " 157900" " 158200" " 6.325111e-04"
2011-07-22 09:35:00 "AAPL" "34500" "09:34:59.681.827" "09:34:59.681.797" "3899200" "3899200" "3892200" "3894400" "-1.231022e-03"
2011-07-22 09:35:00 "ABC"  "34500" "09:34:49.805.994" "09:34:49.806.008" " 400100" " 401800" " 400100" " 401600" " 3.749063e-03"
2011-07-22 09:35:00 "ALL"  "34500" "09:34:59.009.001" "09:34:59.008.810" " 285500" " 285500" " 285300" " 285300" "-7.005254e-04"
2011-07-22 09:35:00 "AMAT" "34500" "09:34:59.982.447" "09:34:59.982.423" " 130200" " 130500" " 130200" " 130500" " 2.304147e-03"
2011-07-22 09:35:00 "AMZN" "34500" "09:34:48.012.576" "09:34:48.012.565" "2137400" "2139100" "2137400" "2139100" " 7.953588e-04"
... (15 more columns)
> system.time(by(ets, ets$Symbol, function(x) { return(x) }))
   user  system elapsed 
 78.725   0.932  79.735
> system.time(ddply(as.data.frame(ets), "Symbol", function(x) { return (x) }))
   user  system elapsed 
100.590   0.416 101.105 
> system.time(lapply(split.default(ets, ets$Symbol), function(x) { return(x) }))
   user  system elapsed 
  1.572   0.280   1.853

Более подробную информацию о работе с подгруппой фрейма данных и матрицы можно найти в этом отличном сообщении в блоге.

Почему такая большая разница впроизводительность при использовании lapply / split.default?

1 Ответ

0 голосов
/ 18 января 2012

Работа в числовом режиме значительно сокращает время обработки:

> system.time(by(myxts[,c(1,2,3,4,5)], myxts$Symbol, summary))
   user  system elapsed 
 57.768   0.688  58.511 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8)], myxts$Symbol, summary))
   user  system elapsed 
  62.284   0.620  62.971 
> system.time(by(myxts[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary))
    user  system elapsed 
 76.529   0.632  77.232 
> myxts.numeric = myxts
> mode(myxts.numeric) = "numeric"
Warning message:
In as.double.xts(c("AA", "AAPL", "ABC", "ALL", "AMAT", "AMZN", "BAC",  :
  NAs introduced by coercion
> system.time(by(myxts.numeric[,c(1,2,3,4,5,6,7,8, 9, 10, 11, 12)], myxts$Symbol, summary))
   user  system elapsed 
  4.948   0.688   5.642
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...