arrays - 在 R 中,填充未知大小的向量的有效方法是什么?
问题描述
v <- c()
i <- 1
while (some_condition) {
v[i] <- some_value
i <- i + 1
}
所以我知道每次修改 v 时都会制作一个副本并移动 v。这显然非常缓慢。这似乎是其他语言中的琐事问题。在 R 中执行此操作的有效方法是什么?
解决方案
据我所知,没有本地方法可以填充未知长度的向量,而无需不断地将其重写到内存中。也许data.table
有一些技巧?
缺乏任何复杂的解决方案,就像 12b345b6b78 建议的那样简单地预分配一个超大的向量,可以为您节省相当多的时间。
unk <- 1e5
f1 <- function(unk) {
v <- c()
for (i in 1:unk) {
v[i] <- i
}
v
}
f2 <- function(unk) {
v <- vector(length=unk*2)
for (i in 1:unk) {
v[i] <- i
}
v[1:i]
}
f10 <- function(unk) {
v <- vector(length=unk*10)
for (i in 1:unk) {
v[i] <- i
}
v[1:i]
}
library(microbenchmark)
mb <- microbenchmark(f1(unk), f2(unk), f10(unk), times=50)
mb
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# f1(unk) 27.177678 28.364024 32.65618 29.896673 36.18994 48.37088 50 c
# f2(unk) 8.075867 9.025156 10.87335 9.271589 10.07932 35.29222 50 a
# f10(unk) 11.132773 13.071857 20.46808 15.059086 21.53610 187.00786 50 b
推荐阅读
- scala - 结合两个状态改变功能的优雅方式?
- c++ - 了解内存序列和 std::memory_order_relaxed
- cassandra - Show query values with datastax.QueryLogger
- laravel - Laravel 雄辩:使用固定数组中的模型
- vue.js - “npm run dev”在默认的 Webpack 简单设置中需要永远打开浏览器
- selenium-webdriver - 如何使用 webdriver.io 从元素的上下文中查找 webelement
- oracle - SYS.DBMS_DDL 权限不足
- r - 首次通过时间
- javascript - 搜索完成后需要自动切换标签
- angular - 无法读取未定义的属性“commitment_id”