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:我认为"大鱼"是比你更有声望的人.所以我在这里很小:).