typestar

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

  1. collect en un Vec conserva el orden original.
  2. Los closures deben ser Send, así que nada de Rc adentro.
  3. Rayon solo rinde cuando el trabajo por elemento es real.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

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

← Anterior Siguiente →