Skip to content

Commit d953fe4

Browse files
jbrockmendelfangchenli
authored andcommitted
PERF: optimize Block.getitem_block (pandas-dev#34978)
1 parent c1e24f7 commit d953fe4

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

pandas/_libs/internals.pyx

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ cnp.import_array()
1616
from pandas._libs.algos import ensure_int64
1717

1818

19+
@cython.final
1920
cdef class BlockPlacement:
2021
# __slots__ = '_as_slice', '_as_array', '_len'
2122
cdef:

pandas/core/internals/blocks.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from pandas._libs import NaT, algos as libalgos, lib, writers
1010
import pandas._libs.internals as libinternals
11+
from pandas._libs.internals import BlockPlacement
1112
from pandas._libs.tslibs import conversion
1213
from pandas._libs.tslibs.timezones import tz_compare
1314
from pandas._typing import ArrayLike
@@ -112,6 +113,19 @@ class Block(PandasObject):
112113
_verify_integrity = True
113114
_validate_ndim = True
114115

116+
@classmethod
117+
def _simple_new(
118+
cls, values: ArrayLike, placement: BlockPlacement, ndim: int
119+
) -> "Block":
120+
"""
121+
Fastpath constructor, does *no* validation
122+
"""
123+
obj = object.__new__(cls)
124+
obj.ndim = ndim
125+
obj.values = values
126+
obj._mgr_locs = placement
127+
return obj
128+
115129
def __init__(self, values, placement, ndim=None):
116130
self.ndim = self._check_ndim(values, ndim)
117131
self.mgr_locs = placement
@@ -289,13 +303,15 @@ def getitem_block(self, slicer, new_mgr_locs=None):
289303
if new_mgr_locs is None:
290304
axis0_slicer = slicer[0] if isinstance(slicer, tuple) else slicer
291305
new_mgr_locs = self.mgr_locs[axis0_slicer]
306+
elif not isinstance(new_mgr_locs, BlockPlacement):
307+
new_mgr_locs = BlockPlacement(new_mgr_locs)
292308

293309
new_values = self._slice(slicer)
294310

295311
if self._validate_ndim and new_values.ndim != self.ndim:
296312
raise ValueError("Only same dim slicing is allowed")
297313

298-
return self.make_block_same_class(new_values, new_mgr_locs)
314+
return type(self)._simple_new(new_values, new_mgr_locs, self.ndim)
299315

300316
@property
301317
def shape(self):

0 commit comments

Comments
 (0)