Filtrar en paralelo en Rust
filter, map y collect tienen versiones paralelas que conservan el orden.
use rayon::prelude::*;
fn is_prime(n: u64) -> bool {
if n < 2 {
return false;
}
(2..=(n as f64).sqrt() as u64).all(|d| n % d != 0)
}
fn main() {
let primes: Vec<u64> = (2..50_000)
.into_par_iter()
.filter(|n| is_prime(*n))
.collect();
println!("{} primes", primes.len());
println!("last five {:?}", &primes[primes.len() - 5..]);
}
Cómo funciona
collecten unVecconserva el orden original.- Los closures deben ser
Send, así que nada deRcadentro. - Rayon solo rinde cuando el trabajo por elemento es real.
Palabras clave y builtins usados aquí
Vecasboolf64fnifletreturnu64use
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 333
- Tokens
- 129
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 74 segundos.
Paso 2 de 3 en Iteradores paralelos; paso 2 de 9 en Paralelismo de datos con rayon.