Rust est de plus en plus utilisé dans l écosystème data (Polars, DataFusion, Lance). En entretien, un Data Engineer qui comprend pourquoi et comment Rust accélère Python se distingue.
Quels outils data majeurs sont écrits en Rust ? Pourquoi ce choix ?
Comment créez-vous une extension Python en Rust avec PyO3 ?
// Cargo.toml
[dependencies]
pyo3 = { version = '0.20', features = ['extension-module'] }
[lib]
crate-type = ['cdylib']
// src/lib.rs
use pyo3::prelude::*;
// Fonction Rust appelable depuis Python
#[pyfunction]
fn fast_hash_many(values: Vec) -> Vec {
// Traitement parallèle avec rayon
use rayon::prelude::*;
values.par_iter()
.map(|v| format!("{:x}", md5::compute(v.as_bytes())))
.collect()
}
#[pymodule]
fn fast_data(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(fast_hash_many, m)?)?;
Ok(())
} ## Python
import fast_data
results = fast_data.fast_hash_many(['email@example.com', 'autre@example.com'])
# 50-100x plus rapide que le hashage Python pur pour de gros volumesQuand a-t-il du sens d écrire une extension Rust pour accélérer un pipeline Python ?
Quelles alternatives à Rust pour accélérer le Python ?
| Outil | Courbe | Gains | Cas d usage |
|---|---|---|---|
| Rust + PyO3 | Élevée | 50-100x | Performance critique, code réutilisable |
| Cython | Moyenne | 5-50x | Code Python existant à accélérer |
| Numba JIT | Faible | 10-100x | Boucles numériques simples (NumPy-like) |
| C Extension (ctypes) | Élevée | 50-100x | Interfacer avec des libs C existantes |
| Polars (Rust natif) | Faible | 5-50x vs pandas | Transformations de DataFrames |
Comment exploitez-vous les capacités Rust de Polars sans écrire de Rust ?
import polars as pl
# Polars utilise Rust en interne pour :
# 1. Parallélisme automatique
df = pl.scan_parquet('data/**/*.parquet')
.filter(pl.col('amount') > 100)
.group_by('region')
.agg(pl.col('amount').sum())
.collect() # Rust parallélise automatiquement
# 2. Extensions Rust via plugins
import polars_plugin # hypothétique
# 3. Lazy API = Rust query optimizer
plan = df.lazy().explain() # voir le plan d exécution Rust
# 4. Apache Arrow : zéro-copy entre Polars (Rust) et Python
arrow_table = df.to_arrow() # zero-copy
pandas_df = df.to_pandas() # via Arrow, très efficaceQuels autres langages ou outils offrent des performances Rust-like pour la data ?
| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Senior | Comprend pourquoi Rust est utilisé en data, tire parti de Polars | Explique le GIL et pourquoi Rust le contourne, utilise Polars intelligemment | Ne sait pas ce qu est PyO3 |
| Expert | A écrit du code Rust, a créé une extension PyO3 | A une extension Rust en production, compare les options d accélération | N a jamais regardé le code Rust de Polars |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.