Skip to content

Commit

Permalink
remove non par sort branches. reduces code bloat
Browse files Browse the repository at this point in the history
  • Loading branch information
ritchie46 committed Sep 15, 2021
1 parent 989d981 commit 190deac
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 42 deletions.
47 changes: 7 additions & 40 deletions polars/polars-core/src/chunked_array/ops/sort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ fn order_reverse_null<T: PartialOrd>(a: &Option<T>, b: &Option<T>) -> Ordering {

fn sort_branch<T, Fd, Fr>(
slice: &mut [T],
sort_parallel: bool,
reverse: bool,
default_order_fn: Fd,
reverse_order_fn: Fr,
Expand All @@ -68,17 +67,14 @@ fn sort_branch<T, Fd, Fr>(
Fd: FnMut(&T, &T) -> Ordering + for<'r, 's> Fn(&'r T, &'s T) -> Ordering + Sync,
Fr: FnMut(&T, &T) -> Ordering + for<'r, 's> Fn(&'r T, &'s T) -> Ordering + Sync,
{
match (sort_parallel, reverse) {
(true, true) => slice.par_sort_unstable_by(reverse_order_fn),
(true, false) => slice.par_sort_unstable_by(default_order_fn),
(false, true) => slice.sort_unstable_by(reverse_order_fn),
(false, false) => slice.sort_unstable_by(default_order_fn),
match reverse {
true => slice.par_sort_unstable_by(reverse_order_fn),
false => slice.par_sort_unstable_by(default_order_fn),
}
}

fn argsort_branch<T, Fd, Fr>(
slice: &mut [T],
sort_parallel: bool,
reverse: bool,
default_order_fn: Fd,
reverse_order_fn: Fr,
Expand All @@ -87,26 +83,14 @@ fn argsort_branch<T, Fd, Fr>(
Fd: FnMut(&T, &T) -> Ordering + for<'r, 's> Fn(&'r T, &'s T) -> Ordering + Sync,
Fr: FnMut(&T, &T) -> Ordering + for<'r, 's> Fn(&'r T, &'s T) -> Ordering + Sync,
{
match (sort_parallel, reverse) {
(true, true) => slice.par_sort_by(reverse_order_fn),
(true, false) => slice.par_sort_by(default_order_fn),
(false, true) => slice.sort_by(reverse_order_fn),
(false, false) => slice.sort_by(default_order_fn),
match reverse {
true => slice.par_sort_by(reverse_order_fn),
false => slice.par_sort_by(default_order_fn),
}
}

/// If the sort should be ran parallel or not.
fn sort_parallel<T>(ca: &ChunkedArray<T>) -> bool {
ca.len()
> std::env::var("POLARS_PAR_SORT_BOUND")
.map(|v| v.parse::<usize>().expect("could not parse"))
.unwrap_or(1000000)
}

macro_rules! argsort {
($self:expr, $reverse:expr) => {{
let sort_parallel = sort_parallel($self);

let mut vals = Vec::with_capacity($self.len());
let mut count: u32 = 0;
$self.downcast_iter().for_each(|arr| {
Expand All @@ -120,7 +104,6 @@ macro_rules! argsort {

argsort_branch(
vals.as_mut_slice(),
sort_parallel,
$reverse,
|(_, a), (_, b)| order_default_null(a, b),
|(_, a), (_, b)| order_reverse_null(a, b),
Expand Down Expand Up @@ -159,18 +142,10 @@ where
T::Native: std::cmp::PartialOrd,
{
fn sort(&self, reverse: bool) -> ChunkedArray<T> {
let sort_parallel = sort_parallel(self);

if self.null_count() == 0 {
let mut vals = memcpy_values(self);

sort_branch(
vals.as_mut_slice(),
sort_parallel,
reverse,
order_default,
order_reverse,
);
sort_branch(vals.as_mut_slice(), reverse, order_default, order_reverse);

return ChunkedArray::new_from_aligned_vec(self.name(), vals);
} else {
Expand All @@ -181,7 +156,6 @@ where
});
sort_branch(
vals.as_mut_slice(),
sort_parallel,
reverse,
order_default_null,
order_reverse_null,
Expand All @@ -199,8 +173,6 @@ where
}

fn argsort(&self, reverse: bool) -> UInt32Chunked {
let sort_parallel = sort_parallel(self);

let ca: NoNull<UInt32Chunked> = if self.null_count() == 0 {
let mut vals = Vec::with_capacity(self.len());
let mut count: u32 = 0;
Expand All @@ -216,7 +188,6 @@ where

argsort_branch(
vals.as_mut_slice(),
sort_parallel,
reverse,
|(_, a), (_, b)| a.partial_cmp(b).unwrap(),
|(_, a), (_, b)| b.partial_cmp(a).unwrap(),
Expand All @@ -237,7 +208,6 @@ where

argsort_branch(
vals.as_mut_slice(),
sort_parallel,
reverse,
|(_, a), (_, b)| order_default_null(a, b),
|(_, a), (_, b)| order_reverse_null(a, b),
Expand Down Expand Up @@ -336,12 +306,9 @@ macro_rules! sort {

impl ChunkSort<Utf8Type> for Utf8Chunked {
fn sort(&self, reverse: bool) -> Utf8Chunked {
let sort_parallel = sort_parallel(self);

let mut v = Vec::from_iter(self);
sort_branch(
v.as_mut_slice(),
sort_parallel,
reverse,
order_default_null,
order_reverse_null,
Expand Down
2 changes: 0 additions & 2 deletions polars/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,6 @@
//! ```
//! ## Config with ENV vars
//!
//! * `POLARS_PAR_SORT_BOUND` -> sets the lower bound of rows at which Polars will use a parallel sorting algorithm.
//! Default is 1M rows.
//! * `POLARS_FMT_NO_UTF8` -> use ascii tables in favor of utf8.
//! * `POLARS_FMT_MAX_COLS` -> maximum number of columns shown when formatting DataFrames.
//! * `POLARS_FMT_MAX_ROWS` -> maximum number of rows shown when formatting DataFrames.
Expand Down

0 comments on commit 190deac

Please sign in to comment.