我想知道三个建议的方法中哪一个(加上第四个)最快,所以我做了一些基准测试。
digitsum1 <- function(x) sum(as.numeric(unlist(strsplit(as.character(x), split = ""))))
digitsum2 <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)
使用 GLDEX 包中的函数 digitsBase:
library(GLDEX, quietly = TRUE)
digitsum3 <- function(x) sum(digitsBase(x, base = 10))
基于 Greg Snow 在R-help 邮件列表中的一个功能:
digitsum4 <- function(x) sum(x %/% 10^seq(0, length.out = nchar(x)) %% 10)
基准代码:
library(microbenchmark, quietly = TRUE)
# define check function
my_check <- function(values) {
all(sapply(values[-1], function(x) identical(values[[1]], x)))
}
x <- 1001L:2000L
microbenchmark(
sapply(x, digitsum1),
sapply(x, digitsum2),
sapply(x, digitsum3),
sapply(x, digitsum4),
times = 100L, check = my_check
)
基准测试结果:
#> Unit: milliseconds
#> expr min lq mean median uq max neval
#> sapply(x, digitsum1) 3.41 3.59 3.86 3.68 3.89 5.49 100
#> sapply(x, digitsum2) 3.00 3.19 3.41 3.25 3.34 4.83 100
#> sapply(x, digitsum3) 15.07 15.85 16.59 16.22 17.09 24.89 100
#> sapply(x, digitsum4) 9.76 10.29 11.18 10.56 11.48 45.20 100
变体 2 比变体 1 稍快,而变体 4 和 3 则慢得多。虽然变体 4 的代码似乎与变体 2 相似,但变体 4 的效率较低(但仍比变体 3 好)。
完整的基准测试结果(包括图表)在github 上。