Growing List vs Growing Queue
[This article was first published on S+/R – Yet Another Blog in Statistical Computing, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
### GROWING LIST ### base_lst1 <- function(df) { l <- list() for (i in seq(nrow(df))) l[[i]] <- as.list(df[i, ]) return(l) } ### PRE-ALLOCATING LIST ### base_lst2 <- function(df) { l <- vector(mode = "list", length = nrow(df)) for (i in seq(nrow(df))) l[[i]] <- as.list(df[i, ]) return(l) } ### DEQUER PACKAGE ### dequer_queue <- function(df) { q <- dequer::queue() for (i in seq(nrow(df))) dequer::pushback(q, as.list(df[i, ])) return(as.list(q)) } ### LIQUEUER PACKAGE ### liqueuer_queue <- function(df) { q <- liqueueR::Queue$new() for (i in seq(nrow(df))) q$push(as.list(df[i, ])) return(q$data) } ### COLLECTIONS PACKAGE ### collections_queue <- function(df) { q <- collections::Queue$new() for (i in seq(nrow(df))) q$push(as.list(df[i, ])) return(q$as_list()) } ### RSTACKDEQUE PACKAGE ### rstackdeque_queue <- function(df) { q <- rstackdeque::rpqueue() for (i in seq(nrow(df))) q <- rstackdeque::insert_back(q, as.list(df[i, ])) return(as.list(q)) } nyc <- read.csv("Downloads/nycflights.csv") compare <- function(ds) { tests <- c("dequer_queue(ds)", "base_lst2(ds)", "liqueuer_queue(ds)", "collections_queue(ds)", "rstackdeque_queue(ds)") for (t in tests) print(identical(base_lst1(ds), eval(parse(text = t)))) } compare(nyc[1:10, ]) #[1] TRUE #[1] TRUE #[1] TRUE #[1] TRUE #[1] TRUE ### BENCHMARKS ### bm <- function(ds) { rbenchmark::benchmark(replications = 5, order = "elapsed", relative = "elapsed", columns = c("test", "replications", "elapsed", "relative"), "GROWING LIST" = base_lst1(ds), "PRE-ALLOCATING LIST" = base_lst2(ds), "DEQUER::QUEUE" = dequer_queue(ds), "LIQUEUER::QUEUE" = liqueuer_queue(ds), "COLLECTIONS::QUEUE" = collections_queue(ds), "RSTACKDEQUE::RPQUEUE" = rstackdeque_queue(ds) ) } bm(nyc[1:1000, ]) test replications elapsed relative #1 GROWING LIST 5 0.808 1.000 #2 PRE-ALLOCATING LIST 5 0.839 1.038 #5 COLLECTIONS::QUEUE 5 0.842 1.042 #4 LIQUEUER::QUEUE 5 1.091 1.350 #3 DEQUER::QUEUE 5 1.375 1.702 #6 RSTACKDEQUE::RPQUEUE 5 1.901 2.353 bm(nyc[1:10000, ]) # test replications elapsed relative #5 COLLECTIONS::QUEUE 5 8.175 1.000 #1 GROWING LIST 5 8.505 1.040 #2 PRE-ALLOCATING LIST 5 12.554 1.536 #4 LIQUEUER::QUEUE 5 17.325 2.119 #6 RSTACKDEQUE::RPQUEUE 5 21.785 2.665 #3 DEQUER::QUEUE 5 22.030 2.695 bm(nyc[1:20000, ]) # test replications elapsed relative #5 COLLECTIONS::QUEUE 5 16.730 1.000 #2 PRE-ALLOCATING LIST 5 17.134 1.024 #1 GROWING LIST 5 17.342 1.037 #4 LIQUEUER::QUEUE 5 48.359 2.891 #6 RSTACKDEQUE::RPQUEUE 5 52.420 3.133 #3 DEQUER::QUEUE 5 79.938 4.778 bm(nyc[1:30000, ]) # test replications elapsed relative #2 PRE-ALLOCATING LIST 5 24.600 1.000 #5 COLLECTIONS::QUEUE 5 24.797 1.008 #1 GROWING LIST 5 25.600 1.041 #6 RSTACKDEQUE::RPQUEUE 5 60.908 2.476 #4 LIQUEUER::QUEUE 5 102.482 4.166 #3 DEQUER::QUEUE 5 182.039 7.400
To leave a comment for the author, please follow the link and comment on their blog: S+/R – Yet Another Blog in Statistical Computing.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.