以下哪项在完成时间方面更有效?
one.way = function(n) { if (n) c(n, one.way(n-1)) }
two.way = function(n) { if (n) c(two.way(n-1), n) }
这里强调的是将单例向量与另一个长度可能大于1的向量组合的顺序。
如果在使用上述功能之一构建向量后需要包含反转向量的时间,您的答案会如何变化?在组合时可能会或可能不知道将需要组合对象的顺序。
答案 0 :(得分:0)
要回答你的问题,他们是平等的
使用microbenchmark
测试两个快速函数的性能
one.way = function(n) { c(n, 1) }
two.way = function(n) { c(1, n) }
n <- 2:100
library(microbenchmark)
microbenchmark(one.way(n), two.way(n), times=1e5)
# expr min lq mean median uq max neval
# one.way(n) 1.399 1.866 2.009775 1.867 1.867 2817.733 1e+05
# two.way(n) 1.399 1.866 2.086267 1.867 1.867 3394.808 1e+05
请注意,下四分位数,中位数和上四分位数都是相同的。手段略有不同,但并不重要。见下文
myfun <- function(n) {
temp <- microbenchmark(one.way(n), two.way(n), times=1e5)
df <- data.frame(one.way = mean(temp$time[temp$expr=="one.way(n)"]),
two.way = mean(temp$time[temp$expr=="two.way(n)"]))
return(df)
}
library(purrr)
test <- map_df(1:100, ~myfun(n))
t.test(test$one.way, test$two.way)
# data: test$one.way and test$two.way
# t = -1.6506, df = 182.72, p-value = 0.1005
# alternative hypothesis: true difference in means is not equal to 0