Skip to content

Commit 5f06c06

Browse files
authored
REF: simplify advance/move/set_length in libreduction (#34982)
1 parent fab7ff2 commit 5f06c06

File tree

1 file changed

+17
-23
lines changed

1 file changed

+17
-23
lines changed

pandas/_libs/reduction.pyx

+17-23
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,7 @@ cdef class _BaseGrouper:
205205

206206
cdef inline object _apply_to_group(self,
207207
object cached_typ, object cached_ityp,
208-
Slider islider, Slider vslider,
209-
Py_ssize_t group_size, bint initialized):
208+
bint initialized):
210209
"""
211210
Call self.f on our new group, then update to the next group.
212211
"""
@@ -222,9 +221,6 @@ cdef class _BaseGrouper:
222221
initialized = True
223222
_check_result_array(res, len(self.dummy_arr))
224223

225-
islider.advance(group_size)
226-
vslider.advance(group_size)
227-
228224
return res, initialized
229225

230226

@@ -269,7 +265,7 @@ cdef class SeriesBinGrouper(_BaseGrouper):
269265
cdef:
270266
ndarray arr, result
271267
ndarray[int64_t] counts
272-
Py_ssize_t i, n, group_size
268+
Py_ssize_t i, n, group_size, start, end
273269
object res
274270
bint initialized = 0
275271
Slider vslider, islider
@@ -293,19 +289,21 @@ cdef class SeriesBinGrouper(_BaseGrouper):
293289

294290
result = np.empty(self.ngroups, dtype='O')
295291

292+
start = 0
296293
try:
297294
for i in range(self.ngroups):
298295
group_size = counts[i]
296+
end = start + group_size
299297

300-
islider.set_length(group_size)
301-
vslider.set_length(group_size)
298+
islider.move(start, end)
299+
vslider.move(start, end)
302300

303301
cached_typ, cached_ityp = self._update_cached_objs(
304302
cached_typ, cached_ityp, islider, vslider)
305303

306304
res, initialized = self._apply_to_group(cached_typ, cached_ityp,
307-
islider, vslider,
308-
group_size, initialized)
305+
initialized)
306+
start += group_size
309307

310308
result[i] = res
311309

@@ -361,7 +359,7 @@ cdef class SeriesGrouper(_BaseGrouper):
361359
# Define result to avoid UnboundLocalError
362360
ndarray arr, result = None
363361
ndarray[int64_t] labels, counts
364-
Py_ssize_t i, n, group_size, lab
362+
Py_ssize_t i, n, group_size, lab, start, end
365363
object res
366364
bint initialized = 0
367365
Slider vslider, islider
@@ -377,6 +375,7 @@ cdef class SeriesGrouper(_BaseGrouper):
377375

378376
result = np.empty(self.ngroups, dtype='O')
379377

378+
start = 0
380379
try:
381380
for i in range(n):
382381
group_size += 1
@@ -385,20 +384,21 @@ cdef class SeriesGrouper(_BaseGrouper):
385384

386385
if i == n - 1 or lab != labels[i + 1]:
387386
if lab == -1:
388-
islider.advance(group_size)
389-
vslider.advance(group_size)
387+
start += group_size
390388
group_size = 0
391389
continue
392390

393-
islider.set_length(group_size)
394-
vslider.set_length(group_size)
391+
end = start + group_size
392+
islider.move(start, end)
393+
vslider.move(start, end)
395394

396395
cached_typ, cached_ityp = self._update_cached_objs(
397396
cached_typ, cached_ityp, islider, vslider)
398397

399398
res, initialized = self._apply_to_group(cached_typ, cached_ityp,
400-
islider, vslider,
401-
group_size, initialized)
399+
initialized)
400+
401+
start += group_size
402402

403403
result[lab] = res
404404
counts[lab] = group_size
@@ -458,19 +458,13 @@ cdef class Slider:
458458
self.buf.data = self.values.data
459459
self.buf.strides[0] = self.stride
460460

461-
cdef advance(self, Py_ssize_t k):
462-
self.buf.data = <char*>self.buf.data + self.stride * k
463-
464461
cdef move(self, int start, int end):
465462
"""
466463
For slicing
467464
"""
468465
self.buf.data = self.values.data + self.stride * start
469466
self.buf.shape[0] = end - start
470467

471-
cdef set_length(self, Py_ssize_t length):
472-
self.buf.shape[0] = length
473-
474468
cdef reset(self):
475469

476470
self.buf.shape[0] = self.orig_len

0 commit comments

Comments
 (0)