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
- Cambiar
iterporpar_itersuele ser todo el cambio. - Rayon dimensiona el pool según la máquina y reparte el trabajo.
- El resultado es idéntico; solo cambia el orden del trabajo.
Palabras clave y builtins usados aquí
Vecfnletu64use
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.
Paso 1 de 3 en Iteradores paralelos; paso 1 de 9 en Paralelismo de datos con rayon.