gpt4 book ai didi

rust - 如何更改功能以与Rayon并行运行?

转载 作者:行者123 更新时间:2023-12-03 11:43:43 27 4
gpt4 key购买 nike

我有一个函数,它获取数组,开始索引和结束索引。我想返回此数组的最大元素。按顺序它可以正常工作。但是我不知道如何将其转换为可工作的。所以你能告诉我怎么做。我一直在尝试人造丝的for_each(),但始终会遇到一些错误。转换后的函数将如何显示?

pub fn search_max(array: &[f32], start: i32, end: i32)-> f32 {
let mut maximum: f32 = A[p as usize];
let iter: usize = start as usize + 1;
for iter in iter..end as usize{
if maximum < array[iter] {
maximum = array[iter];
}
}
maximum
}

最佳答案

您目前拥有所谓的命令式代码;如果不通过功能样式,则不能将其直接更改为并行:

pub fn search_max(array: &[f32], start: i32, end: i32) -> f32 {
let sub_array: &[f32] = &array[start as usize..end as usize];
*sub_array.iter().max().unwrap()
}

我们使用 max 方法获取迭代器产生的最大值。由于 f32不能保证排序正确,因此需要此 does not work
我们将使用 max_by 代替闭包:
pub fn search_max(array: &[f32], start: i32, end: i32) -> f32 {
let sub_array: &[f32] = &array[start as usize..end as usize];

* // This results in &f32, so we must dereference it
sub_array.iter() // Create the iterator over references to the items
.max_by(
|x, y| x.partial_cmp(y).unwrap() // https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html#tymethod.partial_cmp
).unwrap() // There could possibly be no items! So we get an `Option<&f32>` instead.
}

在大多数情况下, rayon ParallelIterator 是常规迭代器的替代品,因此在我们看到 .iter的任何地方,我们都更改为 .par_iter:
use rayon::prelude::*;

pub fn search_max(array: &[f32], start: i32, end: i32) -> f32 {
let sub_array: &[f32] = &array[start as usize..end as usize];
*sub_array.par_iter().max_by(|x, y| x.partial_cmp(y).unwrap()).unwrap()
}

Playground

如果您正在寻找最惯用的版本:
pub fn search_max(slice: &'_ [f32], start: usize, end: usize) -> f32 {
*slice[start..end].par_iter().reduce(
|| &slice[start], // This is an iterator over &'_ f32
|a, b| if a > b { a } else { b },
)
}

Playground

关于rust - 如何更改功能以与Rayon并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59185549/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com