一切都在标题中。我希望 order
用途 sort
找出向量中值的顺序。因此sort
应该比 order
快对向量进行排序,但情况并非如此:
library(microbenchmark)
ss=sample(100,10000,replace=T)
microbenchmark(sort(ss))
microbenchmark(ss[order(ss)])
结果:> microbenchmark(sort(ss))
Unit: microseconds
expr min lq mean median uq max neval
sort(ss) 141.535 144.6415 173.6581 146.358 150.2295 2531.762 100
> microbenchmark(ss[order(ss)])
Unit: microseconds
expr min lq mean median uq max neval
ss[order(ss)] 109.198 110.9865 115.6275 111.901 115.3655 197.204 100
具有更大向量的示例:ss=sample(100,1e8,replace=T)
microbenchmark(sort(ss), ss[order(ss)], times = 5)
# Unit: seconds
# expr min lq mean median uq max neval
# sort(ss) 5.427966 5.431971 5.892629 6.049515 6.207060 6.346633 5
# ss[order(ss)] 3.381253 3.500134 3.562048 3.518079 3.625778 3.784997 5
最佳答案
因为 sort.default()
用途 order
(而不是相反)。
function (x, decreasing = FALSE, na.last = NA, ...)
{
if (is.object(x))
x[order(x, na.last = na.last, decreasing = decreasing)]
else sort.int(x, na.last = na.last, decreasing = decreasing,
...)
}
sort
必须确定它的方法,然后执行相同的 x[order(x)]
当您使用 x[order(x)]
时,调用您正在一步执行直接地。您可以根据需要增加输入的大小。对于整数向量,x[order(x)]
应该总是跑赢sort(x)
.@Hugh's answer一年后表明,大部分差异在于
NA
的默认处理方式。值。这应该是这里公认的答案。
关于r - 为什么排序比 R 中的排序函数慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50954421/