r - 性能:具有多次调用的全局和局部声明

标签 r performance

为什么在R中无论在哪里声明函数(两者性能几乎相同):

library(microbenchmark)

f1 <- function() {
    lapply(1:100000, function(x) {
        fun <- function() 1:10000
        fun()
    })
}

f2 <- function() {
    fun <- function() 1:10000
    lapply(1:100000, function(x) {
        fun()
    })
}

microbenchmark(f1(), f2(), times = 10)

# Unit: milliseconds
# expr      min       lq     mean   median       uq       max neval
# f1() 456.6720 459.2856 563.0407 507.1933 629.0231  922.8278    10
# f2() 438.5753 445.2491 616.4615 548.6700 615.3313 1048.7325    10

为什么在 R 中在哪里声明变量很重要(全局声明工作得更快):

library(microbenchmark)

f1 <- function() {
    lapply(1:100000, function(x) {
        var <- 1:10000
        var
    })
}

f2 <- function() {
    var <- 1:10000
    lapply(1:100000, function(x) {
        var
    })
}

microbenchmark(f1(), f2(), times = 10)

# Unit: milliseconds
# expr       min        lq      mean    median        uq      max neval
# f1() 516.07492 567.71822 611.44760 630.57550 642.47586 701.3975    10
# f2()  49.30975  50.12807  72.44492  52.53448  58.85256 159.2140    10

为什么我会得到这些结果?因此,如果函数应多次调用,最佳做法是避免在函数内部声明变量?

最佳答案

定义函数的性能成本可以忽略不计。仅在调用函数时才评估函数体。

microbenchmark(fun <- function() 1:10000, 
               fun <- function() 1:100000, times = 1000)

#Unit: nanoseconds
#                      expr min  lq    mean median  uq   max neval cld
# fun <- function() 1:10000 198 506 568.462  511.5 548 54620  1000   a
# fun <- function() 1:1e+05 199 504 570.826  511.0 551 18620  1000   a

如果您将此定义重复 1e5 次,则需要大约 50 毫秒,这大约是您的基准测试显示的差异。

创建和填充一个大变量具有更高的性能成本:

microbenchmark(var <- 1:10000, times = 100)
#Unit: microseconds
#           expr   min     lq    mean median    uq    max neval
# var <- 1:10000 4.183 4.3305 4.92081 4.4135 4.538 15.283   100

这样做 1e5 次相当于大约 0.5 秒,这大约是您进行基准测试的差异。

关于你的最后一个问题:是的,至少在变量很大的情况下。

关于r - 性能:具有多次调用的全局和局部声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425500/

相关文章:

r - 当范围每天都在变化时,如何使用 plot() 调整 x 轴?

r - 有条件和的组向量

r - 在 azure-ml : Where can stdout and stderr logs be found? 中调试 R 脚本(或者为什么它们是空的?)

javascript - 降低 Javascript 中 DOM 搜索频率

java - 如何编写一个通用的 isEmpty 方法来检查是否为空?

r - 如何从列名中替换第二次或多次出现的点

r - 从矩阵中删除所有带有0的列

sql-server - SQL Server CE 4.0 性能对比

c++ - 有没有办法并行化下三角矩阵求解器?

c# - for 循环和 Parallel.For() 之间的性能损失(MaxDegreeOfParallelism 为 1)