簡體   English   中英

在循環R中將​​元素添加到向量的最有效的方法(內存和時間)?

[英]Most (memory and time) efficient way to add element to vector in loop R?

我可以想到幾種在循環中向向量添加元素的方法。 對於大循環,時間和內存變得很重要。 哪個記憶/時間效率最高?

這種方法可能不好,因為它在每次迭代時都會復制向量?

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時,差異就很大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM