如何优化Rust迭代器:仅执行一次n²预计算
优化IdentityMatrixIterator的重复计算问题
你的迭代器每次调用next时都会重复计算n2 = self.n * self.n,可以通过将预计算的值存入结构体字段来避免重复运算,具体修改如下:
修改结构体定义
新增n2字段存储预计算的n*n,额外添加n_plus_1字段存储n+1,进一步减少重复加法操作:
fn kronecker_delta_f32<I: Eq>(i: I, j: I) -> f32 { if i == j { 1.0 } else { 0.0 } } struct IdentityMatrixIterator { i: u128, n_plus_1: u128, // 预计算n+1 n2: u128, // 预计算n*n }
实现构造函数
在创建迭代器时一次性完成所有预计算,后续迭代直接复用结果:
impl IdentityMatrixIterator { fn new(n: u128) -> Self { IdentityMatrixIterator { i: 0, n_plus_1: n + 1, n2: n * n, } } }
优化next方法
移除重复运算,直接使用预计算的结构体字段:
impl Iterator for IdentityMatrixIterator { type Item = f32; fn next(&mut self) -> Option<Self::Item> { let i = self.i; self.i += 1; let p = i % self.n_plus_1; let r = kronecker_delta_f32(p, 0); if self.i <= self.n2 { Some(r) } else { None } } }
说明
- 所有需要重复使用的计算值都在迭代器初始化阶段完成计算,后续每次
next调用仅需读取字段值,彻底消除了冗余的算术运算开销。 - 迭代器的核心功能完全保留,依然生成
n×n单位矩阵的元素序列,对角线位置为1.0,其余位置为0.0。
内容的提问来源于stack exchange,提问作者jables
相关产品推荐
相关产品推荐

