typestar

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

  1. reduce combina pares de resultados a medida que terminan.
  2. El closure de identidad aporta un valor inicial neutro.
  3. fold acumula por hilo antes del reduce final.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 2 en Reducciones; paso 4 de 9 en Paralelismo de datos con rayon.

← Anterior Siguiente →