【发布时间】:2019-02-10 01:02:48
【问题描述】:
我将对具有 10^6+ 个元素的多个向量进行逐元素乘法。这在分析中被标记为我的代码中最慢的部分之一,那么我该如何改进它?
/// element-wise multiplication for vecs
pub fn vec_mul<T>(v1: &Vec<T>, v2: &Vec<T>) -> Vec<T>
where
T: std::ops::Mul<Output = T> + Copy,
{
if v1.len() != v2.len() {
panic!("Cannot multiply vectors of different lengths!")
}
let mut out: Vec<T> = Vec::with_capacity(v1.len());
for i in 0..(v1.len()) {
out.push(v1[i] * v2[i]);
}
out
}
【问题讨论】:
-
这个怎么样:
v1.iter().zip(v2).map(|(&i1, &i2)| i1 * i2).collect()? -
考虑矢量化操作。也许使用线性代数或数值数组库可能会有所帮助。
您还通过多次调用.push来不必要地动态调整Vec的大小。 -
@MateenUlhaq
Vec::with_capacity预分配足够的内存;Vec永远不必在这里调整大小。Iterator::collect也使用Vec::with_capacity。 -
@Francis Gagné 成功了!谢谢!
标签: performance optimization rust