Skip to content

Commit 52bcc36

Browse files
authored
CLN: assorted cleanups in cython (#46861)
1 parent 84aefb9 commit 52bcc36

31 files changed

+114
-129
lines changed

pandas/_libs/algos.pyx

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import cython
2-
from cython import Py_ssize_t
3-
1+
cimport cython
2+
from cython cimport Py_ssize_t
43
from libc.math cimport (
54
fabs,
65
sqrt,

pandas/_libs/groupby.pyx

+12-23
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import cython
2-
from cython import Py_ssize_t
3-
4-
from cython cimport floating
1+
cimport cython
2+
from cython cimport (
3+
Py_ssize_t,
4+
floating,
5+
)
56
from libc.stdlib cimport (
67
free,
78
malloc,
@@ -268,7 +269,6 @@ def group_cumsum(
268269
out[i, j] = na_val
269270
continue
270271

271-
272272
if isna_entry:
273273
out[i, j] = na_val
274274
if not skipna:
@@ -1220,7 +1220,7 @@ def group_nth(
12201220
if nobs[lab, j] == rank:
12211221
resx[lab, j] = val
12221222

1223-
# TODO: de-dup this whoel block with group_last?
1223+
# TODO: de-dup this whole block with group_last?
12241224
for i in range(ncounts):
12251225
for j in range(K):
12261226
if nobs[i, j] < min_count:
@@ -1232,6 +1232,9 @@ def group_nth(
12321232
# set a placeholder value in out[i, j].
12331233
if uses_mask:
12341234
result_mask[i, j] = True
1235+
# set out[i, j] to 0 to be deterministic, as
1236+
# it was initialized with np.empty. Also ensures
1237+
# we can downcast out if appropriate.
12351238
out[i, j] = 0
12361239
elif numeric_object_t is float32_t or numeric_object_t is float64_t:
12371240
out[i, j] = NAN
@@ -1369,7 +1372,7 @@ cdef group_min_max(
13691372
"""
13701373
cdef:
13711374
Py_ssize_t i, j, N, K, lab, ngroups = len(counts)
1372-
numeric_t val, nan_val
1375+
numeric_t val
13731376
ndarray[numeric_t, ndim=2] group_min_or_max
13741377
int64_t[:, ::1] nobs
13751378
bint uses_mask = mask is not None
@@ -1386,20 +1389,6 @@ cdef group_min_max(
13861389
group_min_or_max = np.empty_like(out)
13871390
group_min_or_max[:] = _get_min_or_max(<numeric_t>0, compute_max, is_datetimelike)
13881391

1389-
# NB: We do not define nan_val because there is no such thing
1390-
# for uint64_t. We carefully avoid having to reference it in this
1391-
# case.
1392-
if numeric_t is int64_t:
1393-
nan_val = NPY_NAT
1394-
elif numeric_t is int32_t:
1395-
nan_val = util.INT32_MIN
1396-
elif numeric_t is int16_t:
1397-
nan_val = util.INT16_MIN
1398-
elif numeric_t is int8_t:
1399-
nan_val = util.INT8_MIN
1400-
elif numeric_t is float64_t or numeric_t is float32_t:
1401-
nan_val = NAN
1402-
14031392
N, K = (<object>values).shape
14041393

14051394
with nogil:
@@ -1442,11 +1431,11 @@ cdef group_min_max(
14421431
# we can downcast out if appropriate.
14431432
out[i, j] = 0
14441433
elif numeric_t is float32_t or numeric_t is float64_t:
1445-
out[i, j] = nan_val
1434+
out[i, j] = NAN
14461435
elif numeric_t is int64_t:
14471436
# Per above, this is a placeholder in
14481437
# non-is_datetimelike cases.
1449-
out[i, j] = nan_val
1438+
out[i, j] = NPY_NAT
14501439
else:
14511440
# placeholder, see above
14521441
out[i, j] = 0

pandas/_libs/hashing.pyx

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# Translated from the reference implementation
22
# at https://github.com/veorq/SipHash
33

4-
import cython
5-
4+
cimport cython
65
from libc.stdlib cimport (
76
free,
87
malloc,

pandas/_libs/internals.pyx

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
from collections import defaultdict
22

3-
import cython
4-
from cython import Py_ssize_t
5-
3+
cimport cython
64
from cpython.slice cimport PySlice_GetIndicesEx
5+
from cython cimport Py_ssize_t
76

87

98
cdef extern from "Python.h":

pandas/_libs/interval.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ from cpython.datetime cimport (
1111

1212
import_datetime()
1313

14+
cimport cython
1415
from cpython.object cimport (
1516
Py_EQ,
1617
Py_GE,
@@ -20,9 +21,8 @@ from cpython.object cimport (
2021
Py_NE,
2122
PyObject_RichCompare,
2223
)
24+
from cython cimport Py_ssize_t
2325

24-
import cython
25-
from cython import Py_ssize_t
2626
import numpy as np
2727

2828
cimport numpy as cnp

pandas/_libs/join.pyx

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import cython
2-
from cython import Py_ssize_t
1+
cimport cython
2+
from cython cimport Py_ssize_t
33
import numpy as np
44

55
cimport numpy as cnp
@@ -233,6 +233,8 @@ cdef void _get_result_indexer(intp_t[::1] sorter, intp_t[::1] indexer) nogil:
233233
indexer[:] = -1
234234

235235

236+
@cython.wraparound(False)
237+
@cython.boundscheck(False)
236238
def ffill_indexer(const intp_t[:] indexer) -> np.ndarray:
237239
cdef:
238240
Py_ssize_t i, n = len(indexer)

pandas/_libs/lib.pyx

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ from decimal import Decimal
33
from enum import Enum
44
import warnings
55

6-
import cython
7-
from cython import Py_ssize_t
8-
6+
cimport cython
97
from cpython.datetime cimport (
108
PyDate_Check,
119
PyDateTime_Check,
@@ -25,7 +23,10 @@ from cpython.tuple cimport (
2523
PyTuple_New,
2624
PyTuple_SET_ITEM,
2725
)
28-
from cython cimport floating
26+
from cython cimport (
27+
Py_ssize_t,
28+
floating,
29+
)
2930

3031
import_datetime()
3132

pandas/_libs/missing.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ from decimal import Decimal
22
import numbers
33
from sys import maxsize
44

5-
import cython
6-
from cython import Py_ssize_t
5+
cimport cython
6+
from cython cimport Py_ssize_t
77
import numpy as np
88

99
cimport numpy as cnp

pandas/_libs/ops.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import operator
22

3+
cimport cython
34
from cpython.object cimport (
45
Py_EQ,
56
Py_GE,
@@ -9,9 +10,8 @@ from cpython.object cimport (
910
Py_NE,
1011
PyObject_RichCompareBool,
1112
)
13+
from cython cimport Py_ssize_t
1214

13-
import cython
14-
from cython import Py_ssize_t
1515
import numpy as np
1616

1717
from numpy cimport (

pandas/_libs/parsers.pyx

+8-10
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,7 @@ import sys
1212
import time
1313
import warnings
1414

15-
from libc.stdlib cimport free
16-
from libc.string cimport (
17-
strcasecmp,
18-
strlen,
19-
strncpy,
20-
)
21-
22-
import cython
23-
from cython import Py_ssize_t
24-
15+
cimport cython
2516
from cpython.bytes cimport (
2617
PyBytes_AsString,
2718
PyBytes_FromString,
@@ -40,6 +31,13 @@ from cpython.unicode cimport (
4031
PyUnicode_Decode,
4132
PyUnicode_DecodeUTF8,
4233
)
34+
from cython cimport Py_ssize_t
35+
from libc.stdlib cimport free
36+
from libc.string cimport (
37+
strcasecmp,
38+
strlen,
39+
strncpy,
40+
)
4341

4442

4543
cdef extern from "Python.h":

pandas/_libs/properties.pyx

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from cython import Py_ssize_t
2-
31
from cpython.dict cimport (
42
PyDict_Contains,
53
PyDict_GetItem,
64
PyDict_SetItem,
75
)
6+
from cython cimport Py_ssize_t
87

98

109
cdef class CachedProperty:

pandas/_libs/reshape.pyx

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import cython
2-
from cython import Py_ssize_t
3-
1+
cimport cython
2+
from cython cimport Py_ssize_t
43
from numpy cimport (
54
int64_t,
65
ndarray,

pandas/_libs/sparse.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import cython
1+
cimport cython
22
import numpy as np
33

44
cimport numpy as cnp

pandas/_libs/tslib.pyx

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import warnings
22

3-
import cython
4-
3+
cimport cython
54
from cpython.datetime cimport (
65
PyDate_Check,
76
PyDateTime_Check,
@@ -28,14 +27,14 @@ cnp.import_array()
2827
import pytz
2928

3029
from pandas._libs.tslibs.np_datetime cimport (
31-
_string_to_dts,
3230
check_dts_bounds,
3331
dt64_to_dtstruct,
3432
dtstruct_to_dt64,
3533
get_datetime64_value,
3634
npy_datetimestruct,
3735
pydate_to_dt64,
3836
pydatetime_to_dt64,
37+
string_to_dts,
3938
)
4039
from pandas._libs.util cimport (
4140
is_datetime64_object,
@@ -63,6 +62,7 @@ from pandas._libs.tslibs.timestamps cimport _Timestamp
6362
from pandas._libs.tslibs.timestamps import Timestamp
6463

6564
# Note: this is the only non-tslibs intra-pandas dependency here
65+
6666
from pandas._libs.missing cimport checknull_with_nat_and_na
6767
from pandas._libs.tslibs.tzconversion cimport tz_localize_to_utc_single
6868

@@ -83,7 +83,7 @@ def _test_parse_iso8601(ts: str):
8383
elif ts == 'today':
8484
return Timestamp.now().normalize()
8585

86-
_string_to_dts(ts, &obj.dts, &out_local, &out_tzoffset, True)
86+
string_to_dts(ts, &obj.dts, &out_local, &out_tzoffset, True)
8787
obj.value = dtstruct_to_dt64(&obj.dts)
8888
check_dts_bounds(&obj.dts)
8989
if out_local == 1:
@@ -515,7 +515,7 @@ cpdef array_to_datetime(
515515
iresult[i] = NPY_NAT
516516
continue
517517

518-
string_to_dts_failed = _string_to_dts(
518+
string_to_dts_failed = string_to_dts(
519519
val, &dts, &out_local,
520520
&out_tzoffset, False
521521
)

pandas/_libs/tslibs/ccalendar.pyx

+3-4
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
Cython implementations of functions resembling the stdlib calendar module
44
"""
55

6-
import cython
7-
6+
cimport cython
87
from numpy cimport (
98
int32_t,
109
int64_t,
@@ -51,8 +50,8 @@ weekday_to_int = {int_to_weekday[key]: key for key in int_to_weekday}
5150
DAY_SECONDS = 86400
5251
HOUR_SECONDS = 3600
5352

54-
cdef int64_t DAY_NANOS = DAY_SECONDS * 1_000_000_000
55-
cdef int64_t HOUR_NANOS = HOUR_SECONDS * 1_000_000_000
53+
cdef const int64_t DAY_NANOS = DAY_SECONDS * 1_000_000_000
54+
cdef const int64_t HOUR_NANOS = HOUR_SECONDS * 1_000_000_000
5655

5756
# ----------------------------------------------------------------------
5857

pandas/_libs/tslibs/conversion.pyx

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import cython
1+
cimport cython
2+
23
import numpy as np
34

45
cimport numpy as cnp
@@ -31,7 +32,6 @@ from pandas._libs.tslibs.base cimport ABCTimestamp
3132
from pandas._libs.tslibs.np_datetime cimport (
3233
NPY_DATETIMEUNIT,
3334
NPY_FR_ns,
34-
_string_to_dts,
3535
astype_overflowsafe,
3636
check_dts_bounds,
3737
dt64_to_dtstruct,
@@ -43,6 +43,7 @@ from pandas._libs.tslibs.np_datetime cimport (
4343
npy_datetimestruct,
4444
pandas_datetime_to_datetimestruct,
4545
pydatetime_to_dt64,
46+
string_to_dts,
4647
)
4748

4849
from pandas._libs.tslibs.np_datetime import (
@@ -602,7 +603,7 @@ cdef _TSObject _convert_str_to_tsobject(object ts, tzinfo tz, str unit,
602603
dt = datetime.now(tz)
603604
# equiv: datetime.today().replace(tzinfo=tz)
604605
else:
605-
string_to_dts_failed = _string_to_dts(
606+
string_to_dts_failed = string_to_dts(
606607
ts, &dts, &out_local,
607608
&out_tzoffset, False
608609
)

pandas/_libs/tslibs/dtypes.pyx

+1
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ cdef NPY_DATETIMEUNIT freq_group_code_to_npy_unit(int freq) nogil:
317317
return NPY_DATETIMEUNIT.NPY_FR_D
318318

319319

320+
# TODO: use in _matplotlib.converter?
320321
cdef int64_t periods_per_day(NPY_DATETIMEUNIT reso=NPY_DATETIMEUNIT.NPY_FR_ns) except? -1:
321322
"""
322323
How many of the given time units fit into a single day?

pandas/_libs/tslibs/fields.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ objects and arrays
55
from locale import LC_TIME
66

77
from _strptime import LocaleTime
8-
import cython
9-
from cython import Py_ssize_t
8+
cimport cython
9+
from cython cimport Py_ssize_t
1010
import numpy as np
1111

1212
cimport numpy as cnp

0 commit comments

Comments
 (0)