用microbenchmark评估多行代码块

是否可以使用microbenchmark评估由多行代码组成的代码块?如果是这样,怎么样?用microbenchmark评估多行代码块

例子: 我们有一些数字数据在字符列:

testdata <- tibble::tibble(col1 = runif(1000), col2 = as.character(runif(1000)), col3 = as.character(runif(1000))) 

现在,我们可以尝试将这些不同的方式。 我们可以直接调用as.numeric在列:

testdata$col2 <- as.numeric(testdata$col2) 

testdata$col3 <- as.numeric(testdata$col3)

我们可以尝试做内dplyr发生变异:

testdata <- dplyr::mutate(testdata, col2 = as.numeric(col2), 

col3 = as.numeric(col3))

或者我们知道的所有列应是数字,所以我们可以尝试一些不太明确,做一些检查:

testdata <- dplyr::mutate_if(testdata, .predicate = is.character, .funs = as.numeric) 

现在我们要比较这3个选项的性能。

后面的2个选项是单独的调用,所以这些可以很容易地在microbenchmark中测试,但第一个选项包含两个独立的调用。我们可以将这两个调用包装在一个函数中,然后在microbenchmark中对其进行评估,但这会引入该函数的轻微开销,因此技术上不会评估我们现在的解决方案。我们可以将这些调用分别包含在微基准中,然后将它们相加,因为平均值应该很好,但对于最小值或最大值等情况,这并不一定能给出明智的结果。

microbenchmark文档中的示例大多使用简单的单个表达式,并且通常使用简单的函数来包装代码。

是否可以将多行代码直接输入到microbenchmark中进行评估?

回答:

通过{}包裹的多行代码,并将它们与一个;它们可以作为一个块中微基准

bench <- microbenchmark(separate = {as.numeric(testdata$col2); as.numeric(testdata$col3)}, 

mutate = dplyr::mutate(testdata, col2 = as.numeric(col2),

col3 = as.numeric(col3)),

mutateif = dplyr::mutate_if(testdata, .predicate = is.character, .funs = as.numeric))

其中给出了以下结果来评价分离:

> bench 

Unit: microseconds

expr min lq mean median uq max neval

separate 477.014 529.708 594.8982 576.4275 611.6275 1109.762 100

mutate 3410.351 3633.070 4465.0583 3876.6975 4446.0845 34298.910 100

mutateif 5118.725 5365.126 7241.5727 5637.5520 6290.7795 118874.982 100

以上是 用microbenchmark评估多行代码块 的全部内容, 来源链接: utcz.com/qa/265340.html

回到顶部