r语言 - 使用整洁的宇宙编程:速度问题



几年前我们发布了 quickpsy 软件包(R 期刊论文中的论文(。该软件包使用了R基函数,但也广泛使用了当时称为Hadleyverse的函数。我们现在正在开发一个新版本的包,它主要使用来自 tidyverse 的函数,并结合了新的非标准评估方法,发现包要慢得多(慢四倍多(。例如,我们发现 purrr::map 比 dplyr::d o(已弃用(慢得多:

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这样的函数非常慢。

我们不确定 tidyverse 是否不适合用于这种类型的编程,或者我们没有正确使用它。

如果需要每个组的前两行,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 由 reprex 软件包 (v0.2.1.9000(

另请参阅此整洁问题中的基准测试结果

对于这个特定的例子,由nestunnest计算引起的缓慢可以用group_modify来解决

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

最新更新