如何快速创建含重复元素的大型向量?R语言场景性能优化
优化方案:利用重复规律直接生成目标向量
原代码的核心逻辑是生成一个长索引序列ncval3(由1:1000、1:999……1拼接而成),再通过x[ncval3]得到目标向量y。但生成这个大索引向量会额外占用内存且耗时,我们可以直接利用**每个x[i]的重复次数为n - i + 1**的规律,用rep()函数直接构造y,跳过冗余的索引生成步骤,大幅提升运行速度。
优化后的代码
set.seed(0) n <- 1000 x <- as.double(runif(n)) # 直接按重复次数生成目标向量 y <- rep(x, times = n:1L)
性能与结果验证
- 原代码耗时约2.2毫秒,优化后代码耗时约0.1毫秒(具体数值依环境略有差异,但提升幅度显著)
- 可通过以下代码确认结果完全一致:
# 原代码生成对比用的y_old ncval1 <- as.integer(n) ncval2 <- ncval1:1L ncval3 <- sequence(ncval2, from = 1L, by = 1L) y_old <- x[ncval3] # 检查两个向量是否完全相等 all.equal(y, y_old)
运行后会返回TRUE,证明优化前后结果一致。
原理说明
rep(x, times = n:1L)会让x[1]重复n次、x[2]重复n-1次……x[n]重复1次,这和原代码x[ncval3]的结果完全等价,但跳过了生成长度为sum(1:n)的大索引向量的步骤,既节省了内存开销,又减少了索引查找的时间,因此速度得到大幅提升。
内容的提问来源于stack exchange,提问作者matehorvath
相关产品推荐
相关产品推荐

