summaryrefslogtreecommitdiff
path: root/benchmarks
diff options
context:
space:
mode:
authorPieter Eendebak <pieter.eendebak@gmail.com>2022-05-10 14:19:52 +0200
committerPieter Eendebak <pieter.eendebak@gmail.com>2022-05-10 14:19:52 +0200
commit2534a7c77dbc0a6588e5155387d07cedd31c7410 (patch)
tree5124809a71b4bbe6b699487cf7b3247125065b88 /benchmarks
parent247cb34641bbd3481c3df741f88d7bfa65901e1b (diff)
downloadnumpy-2534a7c77dbc0a6588e5155387d07cedd31c7410.tar.gz
PERF Add benchmarks targeted at small arrays and scalars
Diffstat (limited to 'benchmarks')
-rw-r--r--benchmarks/benchmarks/bench_core.py2
-rw-r--r--benchmarks/benchmarks/bench_function_base.py14
-rw-r--r--benchmarks/benchmarks/bench_linalg.py12
-rw-r--r--benchmarks/benchmarks/bench_ufunc.py40
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):