Rya*_*son 14 performance r vector
我正在实现一个算法,该算法涉及从集合中添加和删除大量内容.在R中,这很慢,因为据我所知,从向量中添加或删除内容很慢,因为必须重新分配整个向量.有没有办法更有效地做到这一点?
编辑:我当前的解决方案是使用一个布尔向量,其长度与可以在集合中的事物列表相同,并将其用作成员资格表.
Jam*_*mes 14
R Inferno的第2章对此有一些有趣的评论,包括用于减少内存碎片和分配开销的perdiodic增长对象.
如果您知道集合的最终大小是什么,那么您建议的方法可能是最好的 - 即subset
使用适当的成员资格向量来自整个宇宙.很难知道什么是最好的,但没有看到你正在尝试做什么.
wkm*_*or1 13
如果可以,在算法期间初始化向量使其长度等于其最大长度可能会有所帮助.
例如
vec <- rep(NA,10)
vec[1:3] <- 1:3
vec[4:5] <- 4:5
vec[6:10] <- 6:10
Run Code Online (Sandbox Code Playgroud)
而不是
vec <- 1:3
vec <- c(vec,4:5)
vec <- c(vec,6:10)
Run Code Online (Sandbox Code Playgroud)
相比
> system.time({vec <- rep(NA,10^4); for (i in 1:(10^4)) vec[i] <- i })
user system elapsed
0.043 0.001 0.044
Run Code Online (Sandbox Code Playgroud)
至
> system.time({vec <- NULL; for (i in 1:(10^4)) vec <- c(vec,i) })
user system elapsed
0.249 0.089 0.335
Run Code Online (Sandbox Code Playgroud)
很难说你想要什么。也许您真的想要堆栈命令,例如push和pop。以下不是那样。但这是一个快速的解决方案。
分配一个足够大的向量,以容纳您需要的所有类型的项目。将每个值设置为NA。添加项目很简单。删除项目会将它们再次设置为NA。使用向量只是na.omit(myVec)
myVec <- numeric (maxLength) # a vector of maximum length
is.na(myVec) <- 1:maxLength # set every item in myVec to NA
myVec[c(2,6,20)] <- 5 # add some values
na.omit(myVec)
#This will also work if you can initialize all of your values to something that you know you won't need.
Run Code Online (Sandbox Code Playgroud)