Last active
November 24, 2018 06:31
-
-
Save statcompute/abf39abf6e50e1ccd274b6bf727a7d60 to your computer and use it in GitHub Desktop.
Growing List vs Growing Queue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### 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