【问题标题】:Evaluate multiline codeblock with microbenchmark使用微基准评估多行代码块
【发布时间】:2018-06-08 03:36:28
【问题描述】:

是否可以使用微基准评估由多行代码组成的代码块?如果有,怎么做?

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

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 mutate 中执行此操作:

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

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

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

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

后两个选项是单独的调用,因此可以很容易地在微基准测试中进行测试,但第一个选项由两个单独的调用组成。我们可以将这两个调用包装在一个函数中,然后在 microbenchmark 中对其进行评估,但这会引入函数的轻微开销,因此在技术上并不能评估我们现在拥有的解决方案。我们可以将调用分别包含在微基准测试中,然后在之后将它们相加,因为平均值应该没问题,但对于像最小值或最大值这样的东西,这不一定给出合理的结果。

微基准测试文档中的示例大多使用简单的单个表达式,并且经常使用简单的函数来包装代码。

是否可以直接将多行代码输入到微基准中一起评估?

【问题讨论】:

    标签: r microbenchmark


    【解决方案1】:

    通过在{} 中包装多行代码并用; 分隔它们,它们可以在微基准测试中作为一个块进行评估

    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 中搜索多行代码块的示例,但找不到任何.在创建我的示例以发布问题时,我想将此解决方案作为我尝试过的示例并最终成功。我认为,由于我没有在网上找到任何现有示例,因此仍然值得发布。
    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 2016-12-23
    • 2013-03-25
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多