From be09aa00aabb3348662b0add71d414553683f6c4 Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Sat, 2 May 2020 23:17:21 +0100 Subject: [PATCH 1/2] New benchmarks --- benches/bench_dict.rs | 14 +++++ benches/bench_list.rs | 35 +++++++++++ benches/bench_pyclass.rs | 133 +++++++++++++++++++++++++++++++++++++++ benches/bench_tuple.rs | 35 +++++++++++ 4 files changed, 217 insertions(+) create mode 100644 benches/bench_list.rs create mode 100644 benches/bench_pyclass.rs create mode 100644 benches/bench_tuple.rs diff --git a/benches/bench_dict.rs b/benches/bench_dict.rs index 73ed49fa42e..c82fb7dc223 100644 --- a/benches/bench_dict.rs +++ b/benches/bench_dict.rs @@ -19,3 +19,17 @@ fn iter_dict(b: &mut Bencher) { } }); } + +#[bench] +fn dict_get_item(b: &mut Bencher) { + let gil = Python::acquire_gil(); + let py = gil.python(); + const LEN: usize = 50_000; + let dict = (0..LEN as u64).map(|i| (i, i * 2)).into_py_dict(py); + let mut sum = 0; + b.iter(|| { + for i in 0..LEN { + sum += dict.get_item(i).unwrap().extract::().unwrap(); + } + }); +} diff --git a/benches/bench_list.rs b/benches/bench_list.rs new file mode 100644 index 00000000000..48c5f5b621e --- /dev/null +++ b/benches/bench_list.rs @@ -0,0 +1,35 @@ +#![feature(test)] + +extern crate test; +use pyo3::prelude::*; +use pyo3::types::PyList; +use test::Bencher; + +#[bench] +fn iter_list(b: &mut Bencher) { + let gil = Python::acquire_gil(); + let py = gil.python(); + const LEN: usize = 100_000; + let list = PyList::new(py, 0..LEN); + let mut sum = 0; + b.iter(|| { + for x in list.iter() { + let i: u64 = x.extract().unwrap(); + sum += i; + } + }); +} + +#[bench] +fn list_get_item(b: &mut Bencher) { + let gil = Python::acquire_gil(); + let py = gil.python(); + const LEN: usize = 50_000; + let list = PyList::new(py, 0..LEN); + let mut sum = 0; + b.iter(|| { + for i in 0..LEN { + sum += list.get_item(i as isize).extract::().unwrap(); + } + }); +} diff --git a/benches/bench_pyclass.rs b/benches/bench_pyclass.rs new file mode 100644 index 00000000000..36559af0d78 --- /dev/null +++ b/benches/bench_pyclass.rs @@ -0,0 +1,133 @@ +#![feature(test)] + +extern crate test; +use pyo3::prelude::*; +use pyo3::PyIterProtocol; +use test::Bencher; + +#[pyclass] +pub struct MyClass { + #[pyo3(get, set)] + obj: PyObject, + + #[pyo3(get, set)] + x: i32, + + values: Vec, +} + +#[pyclass] +pub struct Iter { + inner: std::vec::IntoIter, +} + +#[pyproto] +impl PyIterProtocol for Iter { + fn __next__(mut slf: PyRefMut<'p, Self>) -> PyResult> { + Ok(slf.inner.next()) + } +} + +#[pyproto] +impl PyIterProtocol for MyClass { + fn __iter__(slf: PyRef<'p, Self>) -> PyResult> { + let iter = Iter { + inner: slf.values.clone().into_iter(), + }; + PyCell::new(slf.py(), iter).map(Into::into) + } +} + +#[bench] +fn create_many_pyclass(b: &mut Bencher) { + b.iter(|| { + for i in 0..20 { + let gil = Python::acquire_gil(); + let py = gil.python(); + for j in 0..200 { + let _ = PyCell::new( + py, + MyClass { + obj: py.None(), + x: i * j, + values: vec![], + }, + ); + } + } + }); +} + +#[bench] +fn iter_pyclass(b: &mut Bencher) { + let mut sum = 0; + + b.iter(|| { + let gil = Python::acquire_gil(); + let py = gil.python(); + let obj = PyCell::new( + py, + MyClass { + obj: py.None(), + x: 0, + values: (0..10_000).into_iter().collect(), + }, + ) + .unwrap() + .to_object(py); + + for x in obj.as_ref(py).iter().unwrap() { + sum += x.unwrap().extract::().unwrap(); + } + }); +} + +#[bench] +fn get_property(b: &mut Bencher) { + let gil = Python::acquire_gil(); + let py = gil.python(); + + let obj = PyCell::new( + py, + MyClass { + obj: py.None(), + x: 1, + values: vec![], + }, + ) + .unwrap() + .to_object(py); + let any = obj.as_ref(py); + + let mut sum = 0; + + b.iter(|| { + for _ in 0..4_000 { + sum += any.getattr("x").unwrap().extract::().unwrap(); + } + }); +} + +#[bench] +fn set_property(b: &mut Bencher) { + let gil = Python::acquire_gil(); + let py = gil.python(); + + let obj = PyCell::new( + py, + MyClass { + obj: py.None(), + x: 1, + values: vec![], + }, + ) + .unwrap() + .to_object(py); + let any = obj.as_ref(py); + + b.iter(|| { + for _ in 0..4_000 { + any.setattr("obj", py.None()).unwrap(); + } + }); +} diff --git a/benches/bench_tuple.rs b/benches/bench_tuple.rs new file mode 100644 index 00000000000..a8db6e3f30c --- /dev/null +++ b/benches/bench_tuple.rs @@ -0,0 +1,35 @@ +#![feature(test)] + +extern crate test; +use pyo3::prelude::*; +use pyo3::types::PyTuple; +use test::Bencher; + +#[bench] +fn iter_tuple(b: &mut Bencher) { + let gil = Python::acquire_gil(); + let py = gil.python(); + const LEN: usize = 100_000; + let tuple = PyTuple::new(py, 0..LEN); + let mut sum = 0; + b.iter(|| { + for x in tuple.iter() { + let i: u64 = x.extract().unwrap(); + sum += i; + } + }); +} + +#[bench] +fn tuple_get_item(b: &mut Bencher) { + let gil = Python::acquire_gil(); + let py = gil.python(); + const LEN: usize = 50_000; + let tuple = PyTuple::new(py, 0..LEN); + let mut sum = 0; + b.iter(|| { + for i in 0..LEN { + sum += tuple.get_item(i).extract::().unwrap(); + } + }); +} From e1533129c9115c6a0ad92aab933438ac59bb2956 Mon Sep 17 00:00:00 2001 From: David Hewitt <1939362+davidhewitt@users.noreply.github.com> Date: Sun, 3 May 2020 11:12:31 +0100 Subject: [PATCH 2/2] Remove bench_pyclass --- benches/bench_pyclass.rs | 133 --------------------------------------- 1 file changed, 133 deletions(-) delete mode 100644 benches/bench_pyclass.rs diff --git a/benches/bench_pyclass.rs b/benches/bench_pyclass.rs deleted file mode 100644 index 36559af0d78..00000000000 --- a/benches/bench_pyclass.rs +++ /dev/null @@ -1,133 +0,0 @@ -#![feature(test)] - -extern crate test; -use pyo3::prelude::*; -use pyo3::PyIterProtocol; -use test::Bencher; - -#[pyclass] -pub struct MyClass { - #[pyo3(get, set)] - obj: PyObject, - - #[pyo3(get, set)] - x: i32, - - values: Vec, -} - -#[pyclass] -pub struct Iter { - inner: std::vec::IntoIter, -} - -#[pyproto] -impl PyIterProtocol for Iter { - fn __next__(mut slf: PyRefMut<'p, Self>) -> PyResult> { - Ok(slf.inner.next()) - } -} - -#[pyproto] -impl PyIterProtocol for MyClass { - fn __iter__(slf: PyRef<'p, Self>) -> PyResult> { - let iter = Iter { - inner: slf.values.clone().into_iter(), - }; - PyCell::new(slf.py(), iter).map(Into::into) - } -} - -#[bench] -fn create_many_pyclass(b: &mut Bencher) { - b.iter(|| { - for i in 0..20 { - let gil = Python::acquire_gil(); - let py = gil.python(); - for j in 0..200 { - let _ = PyCell::new( - py, - MyClass { - obj: py.None(), - x: i * j, - values: vec![], - }, - ); - } - } - }); -} - -#[bench] -fn iter_pyclass(b: &mut Bencher) { - let mut sum = 0; - - b.iter(|| { - let gil = Python::acquire_gil(); - let py = gil.python(); - let obj = PyCell::new( - py, - MyClass { - obj: py.None(), - x: 0, - values: (0..10_000).into_iter().collect(), - }, - ) - .unwrap() - .to_object(py); - - for x in obj.as_ref(py).iter().unwrap() { - sum += x.unwrap().extract::().unwrap(); - } - }); -} - -#[bench] -fn get_property(b: &mut Bencher) { - let gil = Python::acquire_gil(); - let py = gil.python(); - - let obj = PyCell::new( - py, - MyClass { - obj: py.None(), - x: 1, - values: vec![], - }, - ) - .unwrap() - .to_object(py); - let any = obj.as_ref(py); - - let mut sum = 0; - - b.iter(|| { - for _ in 0..4_000 { - sum += any.getattr("x").unwrap().extract::().unwrap(); - } - }); -} - -#[bench] -fn set_property(b: &mut Bencher) { - let gil = Python::acquire_gil(); - let py = gil.python(); - - let obj = PyCell::new( - py, - MyClass { - obj: py.None(), - x: 1, - values: vec![], - }, - ) - .unwrap() - .to_object(py); - let any = obj.as_ref(py); - - b.iter(|| { - for _ in 0..4_000 { - any.setattr("obj", py.None()).unwrap(); - } - }); -}