typestar

Iteradores paralelos en Rust

par_iter es iter con un pool de hilos con robo de trabajo detrás.

use rayon::prelude::*;

fn expensive(n: u64) -> u64 {
    (1..=n).map(|k| k % 7).sum()
}

fn main() {
    let inputs: Vec<u64> = (1..=2_000).collect();

    let serial: u64 = inputs.iter().map(|n| expensive(*n)).sum();
    let parallel: u64 = inputs.par_iter().map(|n| expensive(*n)).sum();

    println!("{serial} == {parallel}: {}", serial == parallel);
    println!("threads: {}", rayon::current_num_threads());
}

Cómo funciona

  1. Cambiar iter por par_iter suele ser todo el cambio.
  2. Rayon dimensiona el pool según la máquina y reparte el trabajo.
  3. El resultado es idéntico; solo cambia el orden del trabajo.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
15
Caracteres a escribir
392
Tokens
141
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 81 segundos.

Escribe este fragmento

Paso 1 de 3 en Iteradores paralelos; paso 1 de 9 en Paralelismo de datos con rayon.

Siguiente →