From d984acaee6ebeefcb2fb813008a723f5813eacb1 Mon Sep 17 00:00:00 2001 From: Martin Lange <martin.lange@ufz.de> Date: Wed, 7 Dec 2022 16:29:15 +0100 Subject: [PATCH] add units by constructing a Quantity instead of units multiplication --- benchmarks/data/test_tools.py | 50 +++++++++++++++++++++++++ benchmarks/profiling/mem_huge_memory.py | 2 - src/finam/data/tools.py | 10 ++++- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/benchmarks/data/test_tools.py b/benchmarks/data/test_tools.py index 58177e26..b6cfbb48 100644 --- a/benchmarks/data/test_tools.py +++ b/benchmarks/data/test_tools.py @@ -266,3 +266,53 @@ class TestUnitsTools(unittest.TestCase): info = fm.Info(time=time, grid=fm.UniformGrid((2048, 1024)), units="m") xdata = full(0.0, info) _result = self.benchmark(get_magnitude, xdata=xdata) + + @pytest.mark.benchmark(group="data-tools-slow") + def test_set_units_mul_01_512x256(self): + time = dt.datetime(2000, 1, 1) + info = fm.Info(time=time, grid=fm.UniformGrid((512, 256)), units="m") + xdata = full(0.0, info).magnitude + _result = self.benchmark(set_units_mul, data=xdata, units=fm.UNITS.Unit("m")) + + @pytest.mark.benchmark(group="data-tools-slow") + def test_set_units_mul_02_1024x512(self): + time = dt.datetime(2000, 1, 1) + info = fm.Info(time=time, grid=fm.UniformGrid((1024, 512)), units="m") + xdata = full(0.0, info).magnitude + _result = self.benchmark(set_units_mul, data=xdata, units=fm.UNITS.Unit("m")) + + @pytest.mark.benchmark(group="data-tools-slow") + def test_set_units_mul_03_2048x1024(self): + time = dt.datetime(2000, 1, 1) + info = fm.Info(time=time, grid=fm.UniformGrid((2048, 1024)), units="m") + xdata = full(0.0, info).magnitude + _result = self.benchmark(set_units_mul, data=xdata, units=fm.UNITS.Unit("m")) + + @pytest.mark.benchmark(group="data-tools-slow") + def test_set_units_quant_01_512x256(self): + time = dt.datetime(2000, 1, 1) + info = fm.Info(time=time, grid=fm.UniformGrid((512, 256)), units="m") + xdata = full(0.0, info).magnitude + _result = self.benchmark(set_units_qua, data=xdata, units=fm.UNITS.Unit("m")) + + @pytest.mark.benchmark(group="data-tools-slow") + def test_set_units_quant_02_1024x512(self): + time = dt.datetime(2000, 1, 1) + info = fm.Info(time=time, grid=fm.UniformGrid((1024, 512)), units="m") + xdata = full(0.0, info).magnitude + _result = self.benchmark(set_units_qua, data=xdata, units=fm.UNITS.Unit("m")) + + @pytest.mark.benchmark(group="data-tools-slow") + def test_set_units_quant_03_2048x1024(self): + time = dt.datetime(2000, 1, 1) + info = fm.Info(time=time, grid=fm.UniformGrid((2048, 1024)), units="m") + xdata = full(0.0, info).magnitude + _result = self.benchmark(set_units_qua, data=xdata, units=fm.UNITS.Unit("m")) + + +def set_units_mul(data, units): + return data * units + + +def set_units_qua(data, units): + return fm.UNITS.Quantity(data, units) diff --git a/benchmarks/profiling/mem_huge_memory.py b/benchmarks/profiling/mem_huge_memory.py index cbed59fc..5d7d18b5 100644 --- a/benchmarks/profiling/mem_huge_memory.py +++ b/benchmarks/profiling/mem_huge_memory.py @@ -13,11 +13,9 @@ if __name__ == "__main__": info1 = fm.Info(time=None, grid=fm.UniformGrid(size), units="m") data = fm.data.to_xarray(fm.data.full(0.0, info1), info1) - def gen_data(t): return np.copy(data) - source = fm.modules.CallbackGenerator( callbacks={"Out": (gen_data, info1.copy())}, start=start_time, diff --git a/src/finam/data/tools.py b/src/finam/data/tools.py index 35cb8c34..7617c4ca 100644 --- a/src/finam/data/tools.py +++ b/src/finam/data/tools.py @@ -66,9 +66,15 @@ def prepare(data, info, time_entries=1, force_copy=False): data = data.copy() else: if isinstance(data, np.ndarray): - data = data * units + if force_copy: + data = data * units + else: + data = UNITS.Quantity(data, units) else: - data = np.asarray(data) * units + if force_copy: + data = np.asarray(data) * units + else: + data = UNITS.Quantity(np.asarray(data), units) data = _check_input_shape(data, info, time_entries) return data -- GitLab