2017-10-17 96 views
0

考虑代码:为什么order()比sort.list()更快?

a=runif(1000) 
microbenchmark::microbenchmark(order(a,method="radix")) 
microbenchmark::microbenchmark(sort.list(a,method="radix")) 

运行代码order()更好的性能相比sort.list()我看。另一方面,如果我使用100000的样本大小,则两个函数的性能几乎相同。

为什么发生?

+3

只是一个参考,microbenchmark以多个表达式作为参数。如果你使用'microbenchmark :: microbenchmark(order = order(a,method =“radix”),sort = sort.list(a,方法= “基数”))' – Gregor

回答

5

看看功能sort.list(),它调用order() ie。当这部分相当于时间密集型部分(大向量)时,它们将是相同的:

> base::sort.list 
function (x, partial = NULL, na.last = TRUE, decreasing = FALSE, 
    method = c("shell", "quick", "radix")) 
{ 
    if (is.integer(x) || is.factor(x)) 
     method <- "radix" 
    method <- match.arg(method) 
    if (!is.atomic(x)) 
     stop("'x' must be atomic for 'sort.list'\nHave you called 'sort' on a list?") 
    if (!is.null(partial)) 
     .NotYetUsed("partial != NULL") 
    if (method == "quick") { 
     if (is.factor(x)) 
      x <- as.integer(x) 
     if (is.numeric(x)) 
      return(sort(x, na.last = na.last, decreasing = decreasing, 
       method = "quick", index.return = TRUE)$ix) 
     else stop("method = \"quick\" is only for numeric 'x'") 
    } 
    if (is.na(na.last)) { 
     x <- x[!is.na(x)] 
     na.last <- TRUE 
    } 
    if (method == "radix") { 
     return(order(x, na.last = na.last, decreasing = decreasing, 
      method = "radix")) 
    } 
    .Internal(order(na.last, decreasing, x)) 
}