pyo3/pyo3-benches/benches/bench_frompyobject.rs

90 lines
2.4 KiB
Rust
Raw Normal View History

use std::hint::black_box;
use codspeed_criterion_compat::{criterion_group, criterion_main, Bencher, Criterion};
2021-12-22 00:27:13 +00:00
use pyo3::{
prelude::*,
types::{PyList, PyString},
};
2021-12-22 00:27:13 +00:00
#[derive(FromPyObject)]
#[allow(dead_code)]
2021-12-22 00:27:13 +00:00
enum ManyTypes {
Int(i32),
Bytes(Vec<u8>),
String(String),
2021-12-22 00:27:13 +00:00
}
2022-03-23 07:07:28 +00:00
fn enum_from_pyobject(b: &mut Bencher<'_>) {
2021-12-22 00:27:13 +00:00
Python::with_gil(|py| {
let any = PyString::new_bound(py, "hello world").into_any();
2023-11-21 11:41:43 +00:00
b.iter(|| black_box(&any).extract::<ManyTypes>().unwrap());
2021-12-22 00:27:13 +00:00
})
}
fn list_via_downcast(b: &mut Bencher<'_>) {
Python::with_gil(|py| {
let any = PyList::empty_bound(py).into_any();
b.iter(|| black_box(&any).downcast::<PyList>().unwrap());
})
}
fn list_via_extract(b: &mut Bencher<'_>) {
Python::with_gil(|py| {
let any = PyList::empty_bound(py).into_any();
b.iter(|| black_box(&any).extract::<Bound<'_, PyList>>().unwrap());
})
}
fn not_a_list_via_downcast(b: &mut Bencher<'_>) {
Python::with_gil(|py| {
let any = PyString::new_bound(py, "foobar").into_any();
b.iter(|| black_box(&any).downcast::<PyList>().unwrap_err());
})
}
fn not_a_list_via_extract(b: &mut Bencher<'_>) {
Python::with_gil(|py| {
let any = PyString::new_bound(py, "foobar").into_any();
b.iter(|| black_box(&any).extract::<Bound<'_, PyList>>().unwrap_err());
})
}
#[derive(FromPyObject)]
enum ListOrNotList<'a> {
2023-11-21 11:41:43 +00:00
List(Bound<'a, PyList>),
NotList(Bound<'a, PyAny>),
}
fn not_a_list_via_extract_enum(b: &mut Bencher<'_>) {
Python::with_gil(|py| {
let any = PyString::new_bound(py, "foobar").into_any();
b.iter(|| match black_box(&any).extract::<ListOrNotList<'_>>() {
Ok(ListOrNotList::List(_list)) => panic!(),
2023-11-21 11:41:43 +00:00
Ok(ListOrNotList::NotList(any)) => any,
Err(_) => panic!(),
});
})
}
2021-12-22 00:27:13 +00:00
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("enum_from_pyobject", enum_from_pyobject);
c.bench_function("list_via_downcast", list_via_downcast);
c.bench_function("list_via_extract", list_via_extract);
c.bench_function("not_a_list_via_downcast", not_a_list_via_downcast);
c.bench_function("not_a_list_via_extract", not_a_list_via_extract);
c.bench_function("not_a_list_via_extract_enum", not_a_list_via_extract_enum);
2021-12-22 00:27:13 +00:00
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);