我在 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)
您可以创建一个临时列表并在最后仅append()将其附加一次,而不是在每次迭代中使用。my_list2这适合你吗?
下面是循环中进行 5k 次迭代的示例for:
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\nRun Code Online (Sandbox Code Playgroud)\n请注意,bench::mark()自动检查两个代码是否给出相同的输出。