Skip to content

Commit 8bfeeb2

Browse files
jit pad_inplace
1 parent 81bc116 commit 8bfeeb2

File tree

1 file changed

+41
-32
lines changed

1 file changed

+41
-32
lines changed

pandas/_libs_numba/algos.py

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1+
from __future__ import annotations
2+
3+
import numba
4+
import numpy as np
5+
6+
import pandas._libs_numba.util as util
7+
18
# import cython
29
# from cython import Py_ssize_t
310

411
# from libc.math cimport fabs, sqrt
512
# from libc.stdlib cimport free, malloc
613
# from libc.string cimport memmove
714

8-
# import numpy as np
9-
1015
# cimport numpy as cnp
1116
# from numpy cimport (
1217
# NPY_FLOAT32,
@@ -36,7 +41,6 @@
3641

3742
# cnp.import_array()
3843

39-
import pandas._libs_numba.util as util
4044

4145
# from pandas._libs.khash cimport (
4246
# kh_destroy_int64,
@@ -504,30 +508,16 @@
504508
# uint8_t
505509

506510

507-
def validate_limit(nobs: int, limit=None) -> int:
511+
def _validate_limit(limit: int | None = None) -> None:
508512
"""
509-
Check that the `limit` argument is a positive integer.
510-
511-
Parameters
512-
----------
513-
nobs : int
514-
limit : object
515-
516-
Returns
517-
-------
518-
int
519-
The limit.
513+
Check that the `limit` argument is a positive integer or None.
520514
"""
521515
if limit is None:
522-
lim = nobs
523-
else:
524-
if not util.is_integer_object(limit):
525-
raise ValueError("Limit must be an integer")
526-
if limit < 1:
527-
raise ValueError("Limit must be greater than 0")
528-
lim = limit
529-
530-
return lim
516+
return
517+
elif not util.is_integer_object(limit):
518+
raise ValueError("Limit must be an integer")
519+
elif limit < 1:
520+
raise ValueError("Limit must be greater than 0")
531521

532522

533523
# @cython.boundscheck(False)
@@ -587,22 +577,41 @@ def validate_limit(nobs: int, limit=None) -> int:
587577
# return indexer
588578

589579

590-
def pad_inplace(values, mask, limit=None):
580+
def pad_inplace(values: np.ndarray, mask: np.ndarray, limit: int | None = None) -> None:
581+
_validate_limit(limit)
582+
_pad_inplace(values, mask, limit)
591583

592-
fill_count = 0
593584

594-
N = len(values)
585+
@numba.jit
586+
def _pad_inplace(
587+
values: np.ndarray, mask: np.ndarray, limit: int | None = None
588+
) -> None:
589+
if len(values):
590+
if limit is None:
591+
_pad_inplace_no_limit(values, mask)
592+
else:
593+
_pad_inplace_with_limit(values, mask, limit)
595594

596-
# GH#2778
597-
if N == 0:
598-
return
599595

600-
lim = validate_limit(N, limit)
596+
@numba.jit
597+
def _pad_inplace_no_limit(values: np.ndarray, mask: np.ndarray) -> None:
598+
N = len(values)
599+
val = values[0]
600+
for i in range(N):
601+
if mask[i]:
602+
values[i] = val
603+
else:
604+
val = values[i]
605+
601606

607+
@numba.jit
608+
def _pad_inplace_with_limit(values: np.ndarray, mask: np.ndarray, limit: int) -> None:
609+
N = len(values)
610+
fill_count = 0
602611
val = values[0]
603612
for i in range(N):
604613
if mask[i]:
605-
if fill_count >= lim:
614+
if fill_count >= limit:
606615
continue
607616
fill_count += 1
608617
values[i] = val

0 commit comments

Comments
 (0)