@@ -778,27 +778,29 @@ impl<T: ArrayValue> Array<T> {
778
778
return ;
779
779
}
780
780
let chunk_len: usize = self . shape [ depth..] . iter ( ) . product ( ) ;
781
- if chunk_len == 0 {
781
+ let subrow_len: usize = self . shape [ depth + 1 ..] . iter ( ) . product ( ) ;
782
+ if chunk_len == 0 || subrow_len == 0 {
782
783
return ;
783
784
}
784
785
let is_list = self . rank ( ) == depth + 1 ;
785
786
let mut new_chunk = Vec :: with_capacity ( chunk_len) ;
787
+ let mut indices = Vec :: with_capacity ( chunk_len / subrow_len) ;
786
788
for chunk in self . data . as_mut_slice ( ) . chunks_exact_mut ( chunk_len) {
787
789
if is_list {
788
790
chunk. par_sort_by ( T :: array_cmp) ;
789
791
} else {
790
- let mut indices: Vec < usize > = ( 0 ..chunk. len ( ) / chunk_len ) . collect ( ) ;
792
+ indices. extend ( 0 ..chunk. len ( ) / subrow_len ) ;
791
793
indices. par_sort_by ( |& a, & b| {
792
- chunk[ a * chunk_len ..( a + 1 ) * chunk_len ]
794
+ chunk[ a * subrow_len ..( a + 1 ) * subrow_len ]
793
795
. iter ( )
794
- . zip ( & chunk[ b * chunk_len ..( b + 1 ) * chunk_len ] )
796
+ . zip ( & chunk[ b * subrow_len ..( b + 1 ) * subrow_len ] )
795
797
. map ( |( a, b) | a. array_cmp ( b) )
796
798
. find ( |x| x != & Ordering :: Equal )
797
799
. unwrap_or ( Ordering :: Equal )
798
800
} ) ;
799
801
new_chunk. clear ( ) ;
800
- for i in indices {
801
- new_chunk. extend_from_slice ( & chunk[ i * chunk_len ..( i + 1 ) * chunk_len ] ) ;
802
+ for i in indices. drain ( .. ) {
803
+ new_chunk. extend_from_slice ( & chunk[ i * subrow_len ..( i + 1 ) * subrow_len ] ) ;
802
804
}
803
805
chunk. clone_from_slice ( & new_chunk) ;
804
806
}
@@ -810,27 +812,29 @@ impl<T: ArrayValue> Array<T> {
810
812
return ;
811
813
}
812
814
let chunk_len: usize = self . shape [ depth..] . iter ( ) . product ( ) ;
813
- if chunk_len == 0 {
815
+ let subrow_len: usize = self . shape [ depth + 1 ..] . iter ( ) . product ( ) ;
816
+ if chunk_len == 0 || subrow_len == 0 {
814
817
return ;
815
818
}
816
819
let is_list = self . rank ( ) == depth + 1 ;
817
820
let mut new_chunk = Vec :: with_capacity ( chunk_len) ;
821
+ let mut indices = Vec :: with_capacity ( chunk_len / subrow_len) ;
818
822
for chunk in self . data . as_mut_slice ( ) . chunks_exact_mut ( chunk_len) {
819
823
if is_list {
820
824
chunk. par_sort_by ( |a, b| b. array_cmp ( a) ) ;
821
825
} else {
822
- let mut indices: Vec < usize > = ( 0 ..chunk. len ( ) / chunk_len ) . collect ( ) ;
826
+ indices. extend ( 0 ..chunk. len ( ) / subrow_len ) ;
823
827
indices. par_sort_by ( |& a, & b| {
824
- chunk[ a * chunk_len ..( a + 1 ) * chunk_len ]
828
+ chunk[ a * subrow_len ..( a + 1 ) * subrow_len ]
825
829
. iter ( )
826
- . zip ( & chunk[ b * chunk_len ..( b + 1 ) * chunk_len ] )
830
+ . zip ( & chunk[ b * subrow_len ..( b + 1 ) * subrow_len ] )
827
831
. map ( |( a, b) | b. array_cmp ( a) )
828
832
. find ( |x| x != & Ordering :: Equal )
829
833
. unwrap_or ( Ordering :: Equal )
830
834
} ) ;
831
835
new_chunk. clear ( ) ;
832
- for i in indices {
833
- new_chunk. extend_from_slice ( & chunk[ i * chunk_len ..( i + 1 ) * chunk_len ] ) ;
836
+ for i in indices. drain ( .. ) {
837
+ new_chunk. extend_from_slice ( & chunk[ i * subrow_len ..( i + 1 ) * subrow_len ] ) ;
834
838
}
835
839
chunk. clone_from_slice ( & new_chunk) ;
836
840
}
0 commit comments