有一个名为is.unsorted
的基本R
函数非常适合这种情况:
!is.unsorted(vector1)
!is.unsorted(vector2)
!is.unsorted(vector3)
这个函数速度非常快,因为它几乎直接调用了编译好的 C
代码。
我的最初想法是使用 sort
和 identical
,类似于 identical(sort(vector1), vector1)
,但这样做相当慢;不过,我认为这种方法可以扩展到更灵活的情况。
如果速度真的很重要,我们可以跳过一些 is.unsorted
的开销,并直接调用内部函数:
.Internal(is.unsorted(vector1, FALSE))
(FALSE
会将FALSE
传递给strictly
参数)。这在小向量上可以提供约4倍的加速。
为了感受最终选项有多快,这里有一个基准测试:
library(microbenchmark)
set.seed(10101)
srtd <- sort(sample(1e6, rep = TRUE))
unsr <- sample(1e6, rep = TRUE)
microbenchmark(times = 1000L,
josilber = {all(diff(srtd) >= 0)
all(diff(unsr) >= 0)},
mikec = {identical(sort(srtd), srtd)
identical(sort(unsr), unsr)},
baser = {!is.unsorted(srtd)
!is.unsorted(unsr)},
intern = {!.Internal(is.unsorted(srtd, FALSE))
!.Internal(is.unsorted(unsr, FALSE))})
我的机器上的结果:
因此,直接调用内部函数(警告:您需要确保您的向量完全干净--没有NA
等)可以使您的速度比基本的R
函数快大约2倍,而这个函数又比使用diff
快了约30倍,而这个函数又比我的最初选择快了约2倍。
is.unsorted(x)
,而是使用is.unsorted(-x)
。同时检查两者的方法是!is.unsorted(x)|!is.unsorted(-x)
。 - MichaelChiricois.unsorted(-x)
的操作都会比is.unsorted(x)
慢(在我的基准测试中慢5倍至10倍),因为它需要迭代向量并否定所有元素。 - josliber