Interoperabilidade com Python/pandas
Mova tabelas entre Rust e Python com Apache Arrow - evite serialização JSON lenta e preserve dtypes.
Busque em todas as páginas da documentação
Mova tabelas entre Rust e Python com Apache Arrow - evite serialização JSON lenta e preserve dtypes.
Cartão de receita de referência rápida - pronto para copiar e colar.
use polars::prelude::*;
use std::fs::File;
fn export_arrow_ipc(df: &mut DataFrame, path: &str) -> PolarsResult<()> {
let mut file = File::create(path)?;
IpcWriter::new(&mut file).finish(df)?;
Ok(())
}import pyarrow as pa
import pyarrow.ipc as ipc
with pa.memory_map("/tmp/frame.arrow", "r") as source:
table = ipc.open_file(source).read_all()
df = table.to_pandas()Quando usar isso:
O lado Rust escreve IPC; Python lê em pandas sem analisar CSV.
use polars::prelude::*;
fn main() -> PolarsResult<()> {
let mut df = df! {
"user_id" => [1i64, 2, 3],
"score" => [0.9, 0.4, 0.7],
}?;
let mut f = std::fs::File::create("/tmp/users.arrow")?;
IpcWriter::new(&mut f).finish(&mut df)?;
Ok(())
}import pandas as pd
import pyarrow.ipc as ipc
with open("/tmp/users.arrow", "rb") as f:
reader = ipc.open_file(f)
table = reader.read_all()
pdf = table.to_pandas(types_mapper=pd.ArrowDtype)
assert pdf["user_id"].dtype.name.startswith("int")O que isso demonstra:
IpcWriter do Polars produzindo um arquivo que o Python entendePyArrow no mesmo processo (sem arquivo IPC).pd.ArrowDtype para inteiros anuláveis.| Caminho | Cópias | Melhor para |
|---|---|---|
| Arquivo Arrow IPC | Mínimo com mmap | Troca de lotes entre trabalhos |
| PyO3 + pyarrow | No mesmo processo | Loops rápidos em Python chamando Rust |
| Parquet em disco | Custo de decodificação | Lago compartilhado durável entre equipes |
| CSV | Análise completa | Apenas para depuração |
// Ao expor PyO3, use maturin para construir wheels:
// #[pyfunction] fn transform(py: Python, table: Bound<PyAny>) -> PyResult<PyObject> { ... }py.allow_threads em torno da computação Rust.Cargo.lock e requirements.txt.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Apenas lago Parquet | Lotes assíncronos entre equipes | Loops interativos de subsegundo em notebooks |
| gRPC + Arrow Flight | Streaming de serviço para serviço | Troca simples de CLI local |
| DuckDB em ambos | Contrato SQL sobre arquivos | Kernels Rust customizados pesados |
| Polars puro Python | Equipe permanece na API Python | Propriedade Rust do caminho crítico de desempenho |
Com mmap IPC e buffers compatíveis, muitas vezes sim. PyO3 no mesmo processo ainda pode copiar dependendo da propriedade do array - compare o desempenho do seu caminho.
Sim - escreva Arrow IPC ou Parquet do pandas via PyArrow, leia com scan_ipc / read_parquet do Polars.
Não para pipelines de arquivos/lotes. PyO3 ajuda quando Python orquestra e Rust acelera loops apertados em um processo.
Arrow faz a ponte com NumPy para colunas numéricas sem caixas de dtype de objeto - prefira a tabela Arrow como contrato.
Use maturin develop localmente e maturin build para wheels em CI - combine com um pyproject.toml apontando para seu crate.
Sim - escreva IPC para /tmp, leia na próxima célula. Para dados grandes, mmap mantém a RAM estável.
Imprima table.schema em ambos os lados antes das transformações. Falhe rapidamente em Rust com Schema explícito na escrita.
Polars Python compartilha o mesmo núcleo Rust - IPC entre Rust Polars e Python Polars é especialmente suave.
Use Arrow int64 com bitmap nulo; evite o sentinela NaN float do pandas para IDs.
Veja Apache Arrow para os fundamentos do RecordBatch que sustentam essa troca.
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026