gpt4 book ai didi

r - 在循环 R 中向向量添加元素的最(内存和时间)有效方法?

转载 作者:行者123 更新时间:2023-12-03 08:53:31 26 4
gpt4 key购买 nike

我可以想到几种在循环中向向量添加元素的方法。对于大循环,时间和内存变得很重要。哪个内存/时间效率最高?

这个方法可能不好,因为它在每次迭代时都会复制向量?

vec <- c()
for (i in 1:10) {
vec <- c(vec, i)
}

这可能是最佳的?

vec <- c()
for (i in 1:10) {
vec <- append(vec, i)
}

这对于复杂的循环来说可能会很麻烦

vec <- c()
for (i in 1:10) {
vec[i] <- i
}

其他方法?

最佳答案

使用 for 循环时,如果您提前知道迭代次数(因此知道结果向量的大小),则预分配更有意义:

vec <- numeric(10)
for(i in 1:10){
vec[i] <- i
}

这样,您就不会在每次循环中创建新的向量。

要了解时间复杂度,您可以尝试以下代码(使用 microbenchmark 包):

f1 <- function(n) {
vec <- c()
for (i in 1:n) {
vec <- c(vec, i)
}
vec
}

f2 <- function(n) {
vec <- c()
for (i in 1:n) {
vec <- append(vec, i)
}
vec
}

f3 <- function(n) {
vec <- c()
for (i in 1:n) {
vec[i] <- i
}
vec
}

f4 <- function(n) {
vec <- numeric(n)
for(i in 1:n) {
vec[i] <- i
}
vec
}

test <- function(n) {
print(microbenchmark::microbenchmark(f1(n),f2(n),f3(n),f4(n)))
}

例如:

> test(10)
Unit: nanoseconds
expr min lq mean median uq max neval
f1(n) 1411 1763.5 20001.06 1764.0 2117.0 1765199 100
f2(n) 8816 8992.0 33756.65 9521.5 11108.5 2183403 100
f3(n) 2116 2469.0 29077.37 2469.0 3879.5 2565287 100
f4(n) 705 1058.0 20699.22 1059.0 1764.0 1906246 100
> test(100)
Unit: microseconds
expr min lq mean median uq max neval
f1(n) 21.158 22.5680 23.11462 22.9205 23.450 28.562 100
f2(n) 95.913 98.3805 100.45053 100.1440 101.554 112.838 100
f3(n) 19.747 20.8050 21.96511 21.1580 22.568 38.435 100
f4(n) 5.290 5.6420 5.91758 5.6430 5.995 9.521 100
> test(1000)
Unit: microseconds
expr min lq mean median uq max neval
f1(n) 842.402 856.8590 2526.95373 875.3715 1060.4950 8562.944 100
f2(n) 1622.390 1642.4890 2772.92502 1669.4640 1710.5440 9472.342 100
f3(n) 185.125 192.5295 267.38981 194.9980 199.0525 7266.019 100
f4(n) 49.367 51.1300 54.43051 52.8930 55.3610 128.000 100

对于 n = 10,差异很小,但当 n = 1000 时,差异就非常巨大。

关于r - 在循环 R 中向向量添加元素的最(内存和时间)有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57442283/

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