Skip to content

Commit 648eb40

Browse files
authored
PERF: lib.generate_slices (#42097)
1 parent f652994 commit 648eb40

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

pandas/_libs/lib.pyx

+17-15
Original file line numberDiff line numberDiff line change
@@ -906,12 +906,13 @@ def count_level_2d(ndarray[uint8_t, ndim=2, cast=True] mask,
906906
return counts
907907

908908

909+
@cython.wraparound(False)
910+
@cython.boundscheck(False)
909911
def generate_slices(const intp_t[:] labels, Py_ssize_t ngroups):
910912
cdef:
911913
Py_ssize_t i, group_size, n, start
912914
intp_t lab
913-
object slobj
914-
ndarray[int64_t] starts, ends
915+
int64_t[::1] starts, ends
915916

916917
n = len(labels)
917918

@@ -920,19 +921,20 @@ def generate_slices(const intp_t[:] labels, Py_ssize_t ngroups):
920921

921922
start = 0
922923
group_size = 0
923-
for i in range(n):
924-
lab = labels[i]
925-
if lab < 0:
926-
start += 1
927-
else:
928-
group_size += 1
929-
if i == n - 1 or lab != labels[i + 1]:
930-
starts[lab] = start
931-
ends[lab] = start + group_size
932-
start += group_size
933-
group_size = 0
934-
935-
return starts, ends
924+
with nogil:
925+
for i in range(n):
926+
lab = labels[i]
927+
if lab < 0:
928+
start += 1
929+
else:
930+
group_size += 1
931+
if i == n - 1 or lab != labels[i + 1]:
932+
starts[lab] = start
933+
ends[lab] = start + group_size
934+
start += group_size
935+
group_size = 0
936+
937+
return np.asarray(starts), np.asarray(ends)
936938

937939

938940
def indices_fast(ndarray[intp_t] index, const int64_t[:] labels, list keys,

0 commit comments

Comments
 (0)