MCPcopy Create free account
hub / github.com/numpy/numpy / npy_timsort

Function npy_timsort

numpy/core/src/npysort/timsort.cpp:2270–2331  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2268}
2269
2270NPY_NO_EXPORT int
2271npy_timsort(void *start, npy_intp num, void *varr)
2272{
2273 PyArrayObject *arr = reinterpret_cast<PyArrayObject *>(varr);
2274 size_t len = PyArray_ITEMSIZE(arr);
2275 PyArray_CompareFunc *cmp = PyArray_DESCR(arr)->f->compare;
2276 int ret;
2277 npy_intp l, n, stack_ptr, minrun;
2278 run stack[TIMSORT_STACK_SIZE];
2279 buffer_char buffer;
2280
2281 /* Items that have zero size don't make sense to sort */
2282 if (len == 0) {
2283 return 0;
2284 }
2285
2286 buffer.pw = NULL;
2287 buffer.size = 0;
2288 buffer.len = len;
2289 stack_ptr = 0;
2290 minrun = compute_min_run_short(num);
2291
2292 /* used for insertion sort and gallop key */
2293 ret = resize_buffer_char(&buffer, len);
2294
2295 if (NPY_UNLIKELY(ret < 0)) {
2296 goto cleanup;
2297 }
2298
2299 for (l = 0; l < num;) {
2300 n = npy_count_run((char *)start, l, num, minrun, buffer.pw, len, cmp,
2301 arr);
2302
2303 /* both s and l are scaled by len */
2304 stack[stack_ptr].s = l;
2305 stack[stack_ptr].l = n;
2306 ++stack_ptr;
2307 ret = npy_try_collapse((char *)start, stack, &stack_ptr, &buffer, len,
2308 cmp, arr);
2309
2310 if (NPY_UNLIKELY(ret < 0)) {
2311 goto cleanup;
2312 }
2313
2314 l += n;
2315 }
2316
2317 ret = npy_force_collapse((char *)start, stack, &stack_ptr, &buffer, len,
2318 cmp, arr);
2319
2320 if (NPY_UNLIKELY(ret < 0)) {
2321 goto cleanup;
2322 }
2323
2324 ret = 0;
2325
2326cleanup:
2327 if (buffer.pw != NULL) {

Callers

nothing calls this directly

Calls 7

PyArray_ITEMSIZEFunction · 0.85
PyArray_DESCRFunction · 0.85
compute_min_run_shortFunction · 0.85
resize_buffer_charFunction · 0.85
npy_count_runFunction · 0.85
npy_try_collapseFunction · 0.85
npy_force_collapseFunction · 0.85

Tested by

no test coverage detected