df-derive 0.3.0

Derive fast conversions from Rust structs into Polars DataFrames.
Documentation
use criterion::{Criterion, criterion_group, criterion_main};
use df_derive::ToDataFrame;

#[path = "support/mod.rs"]
mod bench_support;
#[path = "../tests/common.rs"]
mod core;
use crate::bench_support::configure_criterion;
use crate::core::dataframe::ToDataFrameVec;

const N_OUTER: usize = 10_000;

#[derive(ToDataFrame, Clone)]
struct Inner {
    code: u32,
    label: String,
    ratio: f64,
}

#[derive(ToDataFrame, Clone)]
struct Container {
    id: u64,
    items: Vec<Vec<Inner>>,
}

fn generate_containers() -> Vec<Container> {
    (0..N_OUTER)
        .map(|i| {
            let outer_len = i % 6;
            let items = (0..outer_len)
                .map(|j| {
                    let inner_len = (i + j) % 6;
                    (0..inner_len)
                        .map(|k| Inner {
                            code: u32::try_from(i * 100 + j * 10 + k).unwrap(),
                            label: format!("lbl-{i}-{j}-{k}"),
                            ratio: f64::from(u32::try_from(k).unwrap()).mul_add(0.125, 1.0),
                        })
                        .collect()
                })
                .collect();
            Container {
                id: i as u64,
                items,
            }
        })
        .collect()
}

fn benchmark_vec_vec_struct(c: &mut Criterion) {
    let data = generate_containers();

    c.bench_function("vec_vec_struct_conversion", |b| {
        b.iter(|| {
            let df = std::hint::black_box(&data).to_dataframe().unwrap();
            std::hint::black_box(df)
        });
    });
}

criterion_group! {
    name = benches;
    config = configure_criterion();
    targets = benchmark_vec_vec_struct
}
criterion_main!(benches);