gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:42:58 24 4
gpt4 key购买 nike

为什么在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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com