Skip to content

Instantly share code, notes, and snippets.

@statcompute
Last active November 24, 2018 06:31
Show Gist options
  • Save statcompute/abf39abf6e50e1ccd274b6bf727a7d60 to your computer and use it in GitHub Desktop.
Save statcompute/abf39abf6e50e1ccd274b6bf727a7d60 to your computer and use it in GitHub Desktop.
Growing List vs Growing Queue
### 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment