diff options
author | Pieter Eendebak <pieter.eendebak@gmail.com> | 2022-05-10 14:19:52 +0200 |
---|---|---|
committer | Pieter Eendebak <pieter.eendebak@gmail.com> | 2022-05-10 14:19:52 +0200 |
commit | 2534a7c77dbc0a6588e5155387d07cedd31c7410 (patch) | |
tree | 5124809a71b4bbe6b699487cf7b3247125065b88 /benchmarks | |
parent | 247cb34641bbd3481c3df741f88d7bfa65901e1b (diff) | |
download | numpy-2534a7c77dbc0a6588e5155387d07cedd31c7410.tar.gz |
PERF Add benchmarks targeted at small arrays and scalars
Diffstat (limited to 'benchmarks')
-rw-r--r-- | benchmarks/benchmarks/bench_core.py | 2 | ||||
-rw-r--r-- | benchmarks/benchmarks/bench_function_base.py | 14 | ||||
-rw-r--r-- | benchmarks/benchmarks/bench_linalg.py | 12 | ||||
-rw-r--r-- | benchmarks/benchmarks/bench_ufunc.py | 40 |
4 files changed, 67 insertions, 1 deletions
diff --git a/benchmarks/benchmarks/bench_core.py b/benchmarks/benchmarks/bench_core.py index 30647f4b8..4fcd7ace5 100644 --- a/benchmarks/benchmarks/bench_core.py +++ b/benchmarks/benchmarks/bench_core.py @@ -207,7 +207,7 @@ class Indices(Benchmark): np.indices((1000, 500)) class VarComplex(Benchmark): - params = [10**n for n in range(1, 9)] + params = [10**n for n in range(0, 9)] def setup(self, n): self.arr = np.random.randn(n) + 1j * np.random.randn(n) diff --git a/benchmarks/benchmarks/bench_function_base.py b/benchmarks/benchmarks/bench_function_base.py index d52d7692c..76add240a 100644 --- a/benchmarks/benchmarks/bench_function_base.py +++ b/benchmarks/benchmarks/bench_function_base.py @@ -43,6 +43,20 @@ class Bincount(Benchmark): np.bincount(self.d, weights=self.e) +class Mean(Benchmark): + param_names = ['size'] + params = [[1, 10, 100_000]] + + def setup(self, size): + self.array = np.arange(2*size).reshape(2, size) + + def time_mean(self): + np.mean(self.array) + + def time_mean_axis(self): + np.mean(self.array, axis=1) + + class Median(Benchmark): def setup(self): self.e = np.arange(10000, dtype=np.float32) diff --git a/benchmarks/benchmarks/bench_linalg.py b/benchmarks/benchmarks/bench_linalg.py index 02e657668..a94ba1139 100644 --- a/benchmarks/benchmarks/bench_linalg.py +++ b/benchmarks/benchmarks/bench_linalg.py @@ -98,6 +98,18 @@ class Linalg(Benchmark): self.func(self.a) +class LinalgSmallArrays(Benchmark): + """ Test overhead of linalg methods for small arrays """ + def setup(self): + self.array_5 = np.arange(5.) + self.array_5_5 = np.arange(5.) + + def time_norm_small_array(self): + np.linalg.norm(self.array_5) + + def time_det_small_array(self): + np.linalg.det(self.array_5_5) + class Lstsq(Benchmark): def setup(self): self.a = get_squares_()['float64'] diff --git a/benchmarks/benchmarks/bench_ufunc.py b/benchmarks/benchmarks/bench_ufunc.py index 5aff1f56d..cfa29017d 100644 --- a/benchmarks/benchmarks/bench_ufunc.py +++ b/benchmarks/benchmarks/bench_ufunc.py @@ -57,10 +57,47 @@ class UFunc(Benchmark): def time_ufunc_types(self, ufuncname): [self.f(*arg) for arg in self.args] +class UFuncSmall(Benchmark): + """ Benchmark for a selection of ufuncs on a small arrays and scalars + + Since the arrays and scalars are small, we are benchmarking the overhead + of the numpy ufunc functionality + """ + params = ['abs', 'sqrt', 'cos'] + param_names = ['ufunc'] + timeout = 10 + + def setup(self, ufuncname): + np.seterr(all='ignore') + try: + self.f = getattr(np, ufuncname) + except AttributeError: + raise NotImplementedError() + self.array_5 = np.array([1., 2., 10., 3., 4.]) + self.array_int_3 = np.array([1, 2, 3]) + self.float64 = np.float64(1.1) + self.python_float = 1.1 + + def time_ufunc_small_array(self, ufuncname): + self.f(self.array_5) + + def time_ufunc_small_array_inplace(self, ufuncname): + self.f(self.array_5, out = self.array_5) + + def time_ufunc_small_int_array(self, ufuncname): + self.f(self.array_int_3) + + def time_ufunc_numpy_scalar(self, ufuncname): + self.f(self.float64) + + def time_ufunc_python_float(self, ufuncname): + self.f(self.python_float) + class Custom(Benchmark): def setup(self): self.b = np.ones(20000, dtype=bool) + self.b_small = np.ones(3, dtype=bool) def time_nonzero(self): np.nonzero(self.b) @@ -74,6 +111,9 @@ class Custom(Benchmark): def time_or_bool(self): (self.b | self.b) + def time_and_bool_small(self): + (self.b_small & self.b_small) + class CustomInplace(Benchmark): def setup(self): |