为何np.repeat性能如此高效?Rust实现Poisson bootstrap中repeat函数的性能优化问询
为何np.repeat性能如此高效?Rust实现Poisson bootstrap中repeat函数的性能优化问询
最近我在Rust里实现Poisson bootstrap,特意把自己写的repeat函数和numpy的np.repeat做了性能对比。先给大家说下这个repeat函数的功能:它接收两个参数,一个是数据数组,一个是权重数组,作用是把数据里的每个元素按照对应的权重次数重复输出,比如输入[1, 2, 3]和[1, 2, 0],输出就是[1, 2, 2]。
但实测下来,我写的 naive 版本居然比np.repeat慢了大概4.5倍,这差距有点超出预期,所以想请教下大家:
先贴我目前的Rust实现(naive版):
pub fn repeat_by(arr: &[f64], repeats: &[u64]) -> Vec<f64> { arr.iter() .zip(repeats.iter()) .flat_map(|(&val, &cnt)| std::iter::repeat(val).take(cnt as usize)) .collect() }
我的几个核心问题:
- 为啥
np.repeat性能能这么强?是因为底层用了C写的内存预分配、SIMD指令,还是有其他更巧妙的优化? - 我的Rust代码大概率是哪里拖了后腿?会不会是flat_map搭配repeat迭代器的组合产生了过多的小迭代器开销?
- 针对Poisson bootstrap的场景(这里的权重是泊松分布生成的整数),有没有更适配Rust的优化方向?比如提前计算总长度预分配内存,或者用更底层的内存循环/拷贝代替迭代器?
希望有经验的大佬能给我点优化思路,感激不尽!
内容来源于stack exchange
相关产品推荐
相关产品推荐

