将项目附加到 R 中现有列表的最有效内存方法是什么?

jru*_*003 5 r list

我在 R 中有一个列表,my_list2如下例所示。

我想以最小化峰值 RAM 使用的方式将项目添加到列表中。

有没有比使用该append函数更节省内存的方法?

我知道最好的做法是创建一个“空”列表,然后按照my_list2下面的示例填充它,但这不是一个选项,因为该列表已经存在。

# If I could create the list from scratch I'd do it list this:
my_list <- vector('list', 10)
for (i in 1:10) {
  my_list[[i]] <- i
}

# Is there a better way than the 'append' function?
my_list2 <- list(1)
for (i in 2:10) {
  my_list2 <- append(my_list2, i)
}
Run Code Online (Sandbox Code Playgroud)

bre*_*auv 5

您可以创建一个临时列表并在最后仅append()将其附加一次,而不是在每次迭代中使用。my_list2这适合你吗?

\n

下面是循环中进行 5k 次迭代的示例for

\n
my_list <- list(1)\nmy_list2 <- list(1)\n\nbench::mark(\n  orig = {\n    for (i in 2:5000) {\n      my_list <- append(my_list, i)\n    }\n    my_list\n  },\n  mine = {\n    tmp <- vector("list", 4999)\n    for (i in 1:4999) {\n      tmp[[i]] <- i + 1\n    }\n    append(my_list2, tmp)\n  },\n  iterations = 10\n)\n#> Warning: Some expressions had a GC in every iteration; so filtering is\n#> disabled.\n#> # A tibble: 2 \xc3\x97 6\n#>   expression      min   median `itr/sec` mem_alloc `gc/sec`\n#>   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>\n#> 1 orig       420.01ms    1.69s     0.567    95.7MB     13.6\n#> 2 mine         1.52ms      2ms   406.       96.8KB      0\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,bench::mark()自动检查两个代码是否给出相同的输出。

\n