Программирование с использованием Tidyverse: проблемы со скоростью - PullRequest
0 голосов
/ 01 октября 2018

Мы выпустили пакет quickpsy несколько лет назад ( бумага в журнальной газете R ).Пакет использовал R базовых функций, но также широко использовал функции того, что тогда называлось Hadleyverse.Сейчас мы разрабатываем новую версию пакета, который в основном использует функции из tidyverse и который включает новый нестандартный подход к оценке , и обнаружил, что пакет намного медленнее (большечем в четыре раза медленнее).Например, мы обнаружили, что purrr :: map намного медленнее, чем dplyr :: do (что устарело):

library(tidyverse)

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    do(head(., 2))
  )

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    nest() %>% 
    mutate(temp = map(data, ~head(., 2))) %>% 
    unnest(temp)
)

Мы также обнаружили, что такие функции, как pull, очень медленные.

Мы не уверены, предназначен ли тидиверс для этого типа программирования или мы не используем его должным образом.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

В этом конкретном примере медлительность, вызванная вычислениями nest и unnest, может быть решена с помощью group_map из версии dev dplyr

system.time(
   mtcars %>% 
   group_by(cyl) %>% 
   group_map(~head(., 2))
)
0 голосов
/ 23 октября 2018

slice() - подходящий инструмент для использования, если вы хотите первые две строки каждой группы.И do(), и nest() %>% mutate(map()) %>% unnest() слишком тяжелые и занимают больше памяти:

library(dplyr, warn.conflicts = FALSE)
library(tidyr)
library(purrr)

library(tidyverse)

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    do(head(., 2))
)
#>    user  system elapsed 
#>   0.065   0.003   0.075

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    nest() %>% 
    mutate(temp = map(data, ~head(., 2))) %>% 
    unnest(temp)
)
#>    user  system elapsed 
#>   0.024   0.000   0.024

system.time(
  mtcars %>% 
    group_by(cyl) %>% 
    slice(1:2)
)
#>    user  system elapsed 
#>   0.002   0.000   0.002

Создано в 2018-10-23 пакетом prex (v0.2.1.9000)

См. Также результаты тестов в этом выпуске tidyr

...