|
1 |
| - |
2 |
| - |
3 |
| - |
| 1 | +import datetime |
4 | 2 | import timeit
|
5 | 3 | import argparse
|
6 | 4 |
|
|
16 | 14 | from performance.reference.util import resolve_dtype as resolve_dtype_ref
|
17 | 15 | from performance.reference.util import resolve_dtype_iter as resolve_dtype_iter_ref
|
18 | 16 | from performance.reference.util import array_deepcopy as array_deepcopy_ref
|
| 17 | +from performance.reference.util import isna_element as isna_element_ref |
19 | 18 |
|
20 | 19 | from performance.reference.array_go import ArrayGO as ArrayGOREF
|
21 | 20 |
|
|
29 | 28 | from arraykit import resolve_dtype as resolve_dtype_ak
|
30 | 29 | from arraykit import resolve_dtype_iter as resolve_dtype_iter_ak
|
31 | 30 | from arraykit import array_deepcopy as array_deepcopy_ak
|
| 31 | +from arraykit import isna_element as isna_element_ak |
32 | 32 |
|
33 | 33 | from arraykit import ArrayGO as ArrayGOAK
|
34 | 34 |
|
@@ -250,6 +250,73 @@ class ArrayGOPerfREF(ArrayGOPerf):
|
250 | 250 | entry = staticmethod(ArrayGOREF)
|
251 | 251 |
|
252 | 252 |
|
| 253 | +#------------------------------------------------------------------------------- |
| 254 | +class IsNaElementPerf(Perf): |
| 255 | + NUMBER = 1000 |
| 256 | + |
| 257 | + def pre(self): |
| 258 | + class FloatSubclass(float): pass |
| 259 | + class ComplexSubclass(complex): pass |
| 260 | + |
| 261 | + self.values = [ |
| 262 | + # Na-elements |
| 263 | + np.datetime64('NaT'), np.timedelta64('NaT'), None, float('NaN'), -float('NaN'), |
| 264 | + |
| 265 | + # Non-float, Non-na elements |
| 266 | + 1, 'str', np.datetime64('2020-12-31'), datetime.date(2020, 12, 31), False, |
| 267 | + ] |
| 268 | + |
| 269 | + nan = np.nan |
| 270 | + complex_nans = [ |
| 271 | + complex(nan, 0), |
| 272 | + complex(-nan, 0), |
| 273 | + complex(0, nan), |
| 274 | + complex(0, -nan), |
| 275 | + ] |
| 276 | + |
| 277 | + float_classes = [float, np.float16, np.float32, np.float64, FloatSubclass] |
| 278 | + if hasattr(np, 'float128'): |
| 279 | + float_classes.append(np.float128) |
| 280 | + |
| 281 | + cfloat_classes = [complex, np.complex64, np.complex128, ComplexSubclass] |
| 282 | + if hasattr(np, 'complex256'): |
| 283 | + cfloat_classes.append(np.complex256) |
| 284 | + |
| 285 | + # Append all the different types of nans across dtypes |
| 286 | + for ctor in float_classes: |
| 287 | + self.values.append(ctor(nan)) |
| 288 | + self.values.append(ctor(-nan)) |
| 289 | + |
| 290 | + for ctor in cfloat_classes: |
| 291 | + for complex_nan in complex_nans: |
| 292 | + self.values.append(ctor(complex_nan)) |
| 293 | + |
| 294 | + # Append a wide range of float values, with different precision, across types |
| 295 | + for val in ( |
| 296 | + 1e-1000, 1e-309, 1e-39, 1e-16, 1e-5, 0.1, 0., 1.0, 1e5, 1e16, 1e39, 1e309, 1e1000, |
| 297 | + ): |
| 298 | + for ctor in float_classes: |
| 299 | + self.values.append(ctor(val)) |
| 300 | + self.values.append(ctor(-val)) |
| 301 | + |
| 302 | + for ctor in cfloat_classes: |
| 303 | + self.values.append(ctor(complex(val, val))) |
| 304 | + self.values.append(ctor(complex(-val, val))) |
| 305 | + self.values.append(ctor(complex(val, -val))) |
| 306 | + self.values.append(ctor(complex(-val, -val))) |
| 307 | + |
| 308 | + def main(self): |
| 309 | + for _ in range(10): |
| 310 | + for val in self.values: |
| 311 | + self.entry(val) |
| 312 | + |
| 313 | +class IsNaElementPerfAK(IsNaElementPerf): |
| 314 | + entry = staticmethod(isna_element_ak) |
| 315 | + |
| 316 | +class IsNaElementPerfREF(IsNaElementPerf): |
| 317 | + entry = staticmethod(isna_element_ref) |
| 318 | + |
| 319 | + |
253 | 320 | #-------------------------------------------------------------------------------
|
254 | 321 |
|
255 | 322 | def get_arg_parser():
|
|
0 commit comments