Reduce y fold en Rust
La reducción paralela necesita un valor identidad y una operación asociativa.
use rayon::prelude::*;
fn main() {
let values: Vec<i64> = (1..=1_000).collect();
let sum = values.par_iter().copied().reduce(|| 0, |a, b| a + b);
println!("{sum}");
let (count, total) = values
.par_iter()
.fold(|| (0u32, 0i64), |(c, t), v| (c + 1, t + v))
.reduce(|| (0, 0), |a, b| (a.0 + b.0, a.1 + b.1));
println!("{count} values totalling {total}");
let longest = ["fig", "banana", "kiwi"]
.par_iter()
.max_by_key(|w| w.len());
println!("{:?}", longest);
}
Cómo funciona
reducecombina pares de resultados a medida que terminan.- El closure de identidad aporta un valor inicial neutro.
foldacumula por hilo antes del reduce final.
Palabras clave y builtins usados aquí
Vecfni64letu32use
El intento, en números
- Líneas
- 19
- Caracteres a escribir
- 463
- Tokens
- 196
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 107 segundos.
Paso 1 de 2 en Reducciones; paso 4 de 9 en Paralelismo de datos con rayon.