挑战:优化不公开[easy]

Rom*_*rik 12 optimization r list vector

因为最近SO有点慢,我发布了一个简单的问题.如果大鱼留在替补席上为新手提供回应,我将不胜感激.

有时我们的对象具有大量的大型列表元素(向量).您如何将此对象"取消"到单个向量中.证明你的方法比你快unlist().

Vit*_*hKa 11

如果你不需要名字而你的名单是一个深度,那么如果你能打败

.Internal(unlist(your_list, FALSE, FALSE))
Run Code Online (Sandbox Code Playgroud)

我将在接下来的一年里对你在SO上所做的一切进行投票!

[更新:如果需要非唯一名称并且列表不是递归的,这里的版本比非列表100次改进

 myunlist <- function(l){
    names <- names(l)
    vec <- unlist(l, F, F)
    reps <- unlist(lapply(l, length), F, F)
    names(vec) <- rep(names, reps)
    vec
    }

 myunlist(list(a=1:3, b=2))
 a a a b 
 1 2 3 2 

 > tl <- list(a = 1:20000, b = 1:5000, c = 2:30)
 > system.time(for(i in 1:200) unlist(tl))
 user  system elapsed 
 22.97    0.00   23.00 

 > system.time(for(i in 1:200) myunlist(tl))
 user  system elapsed 
 0.2     0.0     0.2 

 > system.time(for(i in 1:200) unlist(tl, F, F))
 user  system elapsed 
 0.02    0.00    0.02 
Run Code Online (Sandbox Code Playgroud)

]

[更新2:响应来自里奇棉花的Nr3挑战.

bigList3 <- replicate(500, rnorm(1e3), simplify = F)

unlist_vit <- function(l){
    names(l) <- NULL
    do.call(c, l)
    }

library(rbenchmark)

benchmark(unlist = unlist(bigList3, FALSE, FALSE),
          rjc    = unlist_rjc(bigList3),
          vit    = unlist_vit(bigList3),
          order  = "elapsed",
          replications = 100,
          columns = c("test", "relative", "elapsed")
          )

    test  relative elapsed
1 unlist   1.0000    2.06
3    vit   1.4369    2.96
2    rjc   3.5146    7.24
Run Code Online (Sandbox Code Playgroud)

]

PS:我认为"大鱼"是比你更有声望的人.所以我在这里很小:).