gpt4 book ai didi

r - 在 R 中,为什么 v[length(v)+1] = x 比 c(v, x) 好?

转载 作者:行者123 更新时间:2023-12-04 08:41:28 25 4
gpt4 key购买 nike

我编写了以下两个函数,一个使用 concatenate 测试增加向量大小,另一个使用括号:

c_test <- function(n) {
cv = c()
for(i in 1:n) cv = c(cv, i)
cv
}

b_test <- function(n) {
bv = c()
for (i in 1:n) bv[i] = i
bv
}

library(microbenchmark)
microbenchmark(c_test(1e+4), b_test(1e+4), times = 100)

#Unit: milliseconds
# expr min lq mean median uq max neval
# c_test(10000) 140.27923 145.73282 156.82319 148.16175 151.74713 267.2393 100
# b_test(10000) 49.58033 54.42992 56.24268 54.86033 56.30862 132.8394 100

这是一个很大的时差,我不明白为什么使用括号比使用连接好得多。在这两种情况下,分配新内存似乎都需要时间,但这似乎不是真的。我也认为可能是 c(v, x)正在转换 xv 的类型相同在合并之前,但说 v[i] = as.vector(x)不是一个重要的时间成本。

最佳答案

这可能应该是一个评论,因为我不知道实际答案,但时间太长了。

"c"和 "["都是原始的、内部的和通用的。这意味着方法调度是由 C 函数完成的,这是我在回答您的实际问题时所能得到的。那里正在发生一些神秘的事情,在这方面,“[”比“c”更有效。

然而,我确实想指出,根据一些但不是全部的评论,这两种方法都是低效的,不仅仅是因为矢量化。为您期望的向量大小预先分配内存空间确实有很大帮助,比c 之间的差异要大得多。和 [ .与 [ 相比,预分配使您的速度提高了 70% 到 90%。版本:

# very poor - repeated calls to c() to extend
c_test <- function(n) {
cv = c()
for(i in 1:n) cv = c(cv, i)
cv
}

# slightly better - just use []
b_test <- function(n) {
bv = c()
for (i in 1:n) bv[i] = i
bv
}

# much better practice - preallocate length of the vector
d_test <- function(n) {
bv = numeric(n)
for (i in 1:n) bv[i] = i
bv
}

# good practice if possible - vectorisation
e_test <- function(n) {
bv = 1:n
bv
}


library(microbenchmark)
microbenchmark(c_test(1e+4), b_test(1e+4), d_test(1e+4), e_test(1e+4), times = 100)

这给出:
Unit: microseconds
expr min lq mean median uq max neval cld
c_test(10000) 102355.753 111202.568 129250.53638 114237.234 132468.938 220005.926 100 c
b_test(10000) 47337.481 52820.938 77029.01728 59450.864 116529.185 192643.555 100 b
d_test(10000) 6761.877 7492.741 7965.37288 7814.519 8353.778 11007.605 100 a
e_test(10000) 3.555 6.321 9.32347 8.692 10.272 27.259 100 a

此外,正如@Roland 所说,“随着大小的增加,对象的增长会变得更加昂贵”。随着向量变大,内存中可用的位置越来越少。

我很感激 e_test (vectorised) 不适用于您的 Fibonacci 用例,但无论如何都将其保留以进行比较,以了解矢量化可能时的加速规模。

关于r - 在 R 中,为什么 v[length(v)+1] = x 比 c(v, x) 好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639309/

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