大数据场景下优化R语言每7步累积求和的代码性能
优化滑动窗口7元素求和的R代码
你的原代码效率低下的核心问题是重复计算累积和:每次循环都对A[i:50000]重新计算cumsum,这会带来O(n²)的时间复杂度,数据量越大越慢。下面给出两种线性时间复杂度的优化方案,速度会提升几个数量级。
方案1:利用全局累积和的差值计算
只需要对整个向量计算一次累积和,然后通过差值得到每个窗口的和,完全避免循环:
# 计算整个向量的累积和 cum_A <- cumsum(A) # 生成结果向量B:每个元素是A[i]到A[i+6]的和 B <- cum_A[7:length(cum_A)] - c(0, cum_A[1:(length(cum_A)-7)])
原理说明
对于第i个窗口(A[i]到A[i+6]),其和等于:cumsum(A)[i+6] - cumsum(A)[i-1]
- 当i=1时,
cumsum(A)[i-1]视为0,直接取cumsum(A)[7] - 后续位置用累积和的差值快速得到窗口和,仅需一次全局累积和计算,时间复杂度O(n)
方案2:用zoo包的rollsum函数(简洁版)
zoo包提供了专门的滑动窗口计算函数rollsum,代码更简洁直观:
library(zoo) # align="left"表示窗口从当前位置开始向右取7个元素,匹配你的需求 B <- rollsum(A, k=7, align="left")
验证示例
用你给出的测试向量验证:
A <- c(4,1,2,2,6,2,6,6,1,10,5,8,6,9,1) # 方案1结果 cum_A <- cumsum(A) B1 <- cum_A[7:length(cum_A)] - c(0, cum_A[1:(length(cum_A)-7)]) # 方案2结果 library(zoo) B2 <- rollsum(A, k=7, align="left") # 输出结果:均为 [23,25,25,22,23,27,30,30,39] print(B1) print(B2)
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

