From bb55a922b94fe23b19356274e054089d3a9fe527 Mon Sep 17 00:00:00 2001 From: Dorian Pula Date: Tue, 5 Nov 2019 22:29:47 -0500 Subject: [PATCH 1/3] Attempt to batch things. --- src/lib.rs | 14 +++++++++++--- test.py | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3dfee57..e9dc080 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,19 +1,27 @@ #![feature(specialization)] -#[macro_use] extern crate pyo3; +#[macro_use] +extern crate pyo3; use pyo3::prelude::*; - #[pyfunction] fn convert_celsius_to_fahrenheit(celsius: f32) -> f32 { celsius * 1.8 + 32.0 } +#[pyfunction] +fn batch_convert_celsius_to_fahrenheit(celsius: Vec) -> Vec { + celsius + .iter() + .map(|temperature| convert_celsius_to_fahrenheit(temperature.clone())) + .collect() +} + #[pymodule] fn unit_converter(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(convert_celsius_to_fahrenheit))?; - + m.add_wrapped(wrap_pyfunction!(batch_convert_celsius_to_fahrenheit))?; Ok(()) } diff --git a/test.py b/test.py index b9c09fd..4750bae 100644 --- a/test.py +++ b/test.py @@ -1,12 +1,23 @@ import random +import pytest + import unit_converter +@pytest.fixture(scope="module") +def batch_numbers(): + return [random.random() * 100 for x in range(1000)] + + def python_unit_converter(celsius): return celsius * 1.8 + 32.0 +def batch_python_unit_converter(temperatures): + return [celsius * 1.8 + 32.0 for celsius in temperatures] + + def test_using_unit_converter(): assert unit_converter.convert_celsius_to_fahrenheit(25.0) == 77.0 assert python_unit_converter(25.0) == 77.0 @@ -32,3 +43,11 @@ def test_using_rust(benchmark): temperature = random.random() * 100 result = benchmark(unit_converter.convert_celsius_to_fahrenheit, temperature) assert round(result, 3) == round(python_unit_converter(temperature), 3) + + +def test_using_python_batch(benchmark, batch_numbers): + benchmark(batch_python_unit_converter, batch_numbers) + + +def test_using_rust_batch(benchmark, batch_numbers): + benchmark(unit_converter.batch_convert_celsius_to_fahrenheit, batch_numbers) From 0369c3fb861c478b22a49d4693441d37b10daa61 Mon Sep 17 00:00:00 2001 From: Dorian Pula Date: Tue, 5 Nov 2019 22:35:04 -0500 Subject: [PATCH 2/3] Separate out the batching code. --- batch_test.py | 22 ++++++++++++++++++++++ test.py | 15 --------------- 2 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 batch_test.py diff --git a/batch_test.py b/batch_test.py new file mode 100644 index 0000000..1f9dd3b --- /dev/null +++ b/batch_test.py @@ -0,0 +1,22 @@ +import random + +import pytest + +import unit_converter + + +@pytest.fixture(scope="module") +def batch_numbers(): + return [random.random() * 100 for x in range(1000)] + + +def batch_python_unit_converter(temperatures): + return [celsius * 1.8 + 32.0 for celsius in temperatures] + + +def test_using_python_batch(benchmark, batch_numbers): + benchmark(batch_python_unit_converter, batch_numbers) + + +def test_using_rust_batch(benchmark, batch_numbers): + benchmark(unit_converter.batch_convert_celsius_to_fahrenheit, batch_numbers) diff --git a/test.py b/test.py index 4750bae..05191e0 100644 --- a/test.py +++ b/test.py @@ -1,15 +1,8 @@ import random -import pytest - import unit_converter -@pytest.fixture(scope="module") -def batch_numbers(): - return [random.random() * 100 for x in range(1000)] - - def python_unit_converter(celsius): return celsius * 1.8 + 32.0 @@ -43,11 +36,3 @@ def test_using_rust(benchmark): temperature = random.random() * 100 result = benchmark(unit_converter.convert_celsius_to_fahrenheit, temperature) assert round(result, 3) == round(python_unit_converter(temperature), 3) - - -def test_using_python_batch(benchmark, batch_numbers): - benchmark(batch_python_unit_converter, batch_numbers) - - -def test_using_rust_batch(benchmark, batch_numbers): - benchmark(unit_converter.batch_convert_celsius_to_fahrenheit, batch_numbers) From 996bba9d1086babd2e082524b46b34ec749d7ca2 Mon Sep 17 00:00:00 2001 From: Dorian Pula Date: Tue, 5 Nov 2019 22:40:48 -0500 Subject: [PATCH 3/3] Add notes on using larger numberical sets. --- batch_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/batch_test.py b/batch_test.py index 1f9dd3b..e7e2cfe 100644 --- a/batch_test.py +++ b/batch_test.py @@ -8,6 +8,8 @@ import unit_converter @pytest.fixture(scope="module") def batch_numbers(): return [random.random() * 100 for x in range(1000)] + # The larger the range of numbers, the closer the Rust version is to Python. + # e.g. return [random.random() * 100 for x in range(1000000)] def batch_python_unit_converter(temperatures):