docstr: Fast path for indexing in the case where column index is slice.
  
  This gains performance improvement over brute force by more
  efficient skipping of zeros, by accessing the elements
  column-wise in order.
  
  Parameters
  ----------
  rows : sequence or range
      Rows indexed. If range, must be within valid bounds.
  col_slice : slice
      Columns indexed
code: def _get_row_ranges(self, rows, col_slice):
      """
      Fast path for indexing in the case where column index is slice.
  
      This gains performance improvement over brute force by more
      efficient skipping of zeros, by accessing the elements
      column-wise in order.
  
      Parameters
      ----------
      rows : sequence or range
          Rows indexed. If range, must be within valid bounds.
      col_slice : slice
          Columns indexed
  
      """
      j_start, j_stop, j_stride = col_slice.indices(self.shape[1])
      col_range = range(j_start, j_stop, j_stride)
      nj = len(col_range)
      new = self._lil_container((len(rows), nj), dtype=self.dtype)
  
      _csparsetools.lil_get_row_ranges(
          self.shape[0],
          self.shape[1],
          self.rows,
          self.data,
          new.rows,
          new.data,
          rows,
          j_start,
          j_stop,
          j_stride,
          nj,
      )
  
      return new
  
imports: from bisect import bisect_left
  import numpy
  from ._matrix import spmatrix
  from ._base import _spbase, sparray, issparse
  from ._index import IndexMixin, INT_TYPES, _broadcast_arrays
  from ._sputils import getdtype, isshape, isscalarlike, upcast_scalar, check_shape, check_reshape_kwargs
  from .None import _csparsetools
label_desc: Use image node_id 23 for calling the _lil_base obj's underlying member method code with example usage: obj._get_row_ranges(rows, col_slice) and returns: new