I don't know why, but mp_seq_get_fast_slice_indexes adjusts "stop" in a
surprising way, and that led to the (remaining) differences in slicing
between ulab and built-in lists.
// If the index is negative then stop points to the last item, not after it
if (indexes->step < 0) {
indexes->stop++;
}
Call the underlying routine, mp_obj_slice_indices, instead.
- Adapt to signature of mp_make_new_fun_t for mpy and cpy by ifdef
- Use MP_OBJ_IS_TYPE instead of mp_obj_is_type
- Ditto MP_OBJ_IS_INT
- Use mp_const_none instead of MP_ROM_NONE
- Ditto mp_const_true, mp_const_false
Special casing floats decreases runtime to about 50% (applying a 117-tap
filter to 512 points of data goes from 70ms to 32ms)
The top_n/bot_n calculations already meant that the a/c indices were
never out of range. This decreases runtime further to about 15% of
original (11ms)
Timings done on an Adafruit Clue (nrf52840 at 64MHz)
It does of course increase code size somewhat.
These problems were found building in circuitpython:
../../extmod/ulab/code/numerical.c:671:5: error: "ULAB_NUMERICAL_ARGSORT" is not defined, evaluates to 0 [-Werror=undef]
671 | #if ULAB_NUMERICAL_ARGSORT
| ^~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
../../extmod/ulab/code/ulab.c:150:9: error: "ULAB_VECTORISE_" is not defined, evaluates to 0 [-Werror=undef]
150 | #if ULAB_VECTORISE_
| ^~~~~~~~~~~~~~~
../../extmod/ulab/code/ulab.c:159:9: error: "ULAB_VECTORISE_TAHN" is not defined, evaluates to 0 [-Werror=undef]
159 | #if ULAB_VECTORISE_TAHN
| ^~~~~~~~~~~~~~~~~~~
../../extmod/ulab/code/ulab.c:198:9: error: "ULAB_NUMERICAL_ARGSORT" is not defined, evaluates to 0 [-Werror=undef]
198 | #if ULAB_NUMERICAL_ARGSORT
| ^~~~~~~~~~~~~~~~~~~~~~