Skip to content

Commit 48e32a8

Browse files
authored
Merge pull request #206 from Rust-Data-Science/wip-uncheck-bounds
uncheck bounds
2 parents 737c0f3 + eaaadf2 commit 48e32a8

File tree

7 files changed

+35
-51
lines changed

7 files changed

+35
-51
lines changed

ulist/src/base.rs

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ use std::collections::HashSet;
99

1010
pub fn _fill_na<T: Clone>(vec: &mut [T], na_indexes: Ref<HashSet<usize>>, na_value: T) {
1111
for i in na_indexes.iter() {
12-
// TODO: Use get_unchecked_mut instead.
13-
// let ptr = unsafe { vec.get_unchecked_mut(*i) };
14-
// *ptr = na_value.clone();
15-
vec[*i] = na_value.clone();
12+
let ptr = unsafe { vec.get_unchecked_mut(*i) };
13+
*ptr = na_value.clone();
1614
}
1715
}
1816

@@ -150,9 +148,6 @@ where
150148
let mut i = 0;
151149
for ((j, x), cond) in self.values().iter().enumerate().zip(cond.iter()) {
152150
if *cond {
153-
// TODO: Use get_unchecked_mut instead
154-
// let ptr = unsafe { vec.get_unchecked_mut(i) };
155-
// *ptr = x.clone();
156151
vec.push(x.clone());
157152
if self.na_indexes().contains(&j) {
158153
hset.insert(i);
@@ -179,20 +174,19 @@ where
179174
}
180175

181176
fn get_by_indexes(&self, indexes: &IndexList) -> PyResult<Self> {
182-
// TODO: Put this kind of check
183-
// where there is unsafe block.
184177
if indexes.back() >= self.size() {
185178
return Err(PyIndexError::new_err("Index out of range!"));
186179
}
187-
// TODO: use get_unchecked instead.
188-
let mut vec: Vec<T> = Vec::new();
180+
let mut vec: Vec<T> = Vec::with_capacity(indexes.size());
189181
let mut hset: HashSet<usize> = HashSet::new();
190182
for (i, j) in indexes.values().iter().enumerate() {
191-
vec.push(self.values()[*j].clone());
183+
let elem = unsafe { self.values().get_unchecked(*j).clone() };
184+
vec.push(elem);
192185
if self.na_indexes().contains(j) {
193186
hset.insert(i);
194187
}
195188
}
189+
hset.shrink_to_fit();
196190
Ok(List::_new(vec, hset))
197191
}
198192

@@ -238,14 +232,9 @@ where
238232
let n = self.size();
239233
let mut vec = self.values_mut();
240234
for i in 0..n {
241-
// TODO: Use get_unchecked_mut instead.
242-
// let ptr = unsafe { vec.get_unchecked_mut(i) };
243-
// if *ptr == old {
244-
// *ptr = self.na_value();
245-
// self.na_indexes_mut().insert(i);
246-
// }
247-
if vec[i] == old {
248-
vec[i] = self.na_value();
235+
let ptr = unsafe{ vec.get_unchecked_mut(i)};
236+
if *ptr == old {
237+
*ptr = self.na_value();
249238
self.na_indexes_mut().insert(i);
250239
}
251240
}
@@ -255,24 +244,18 @@ where
255244
let n = self.size();
256245
let mut vec = self.values_mut();
257246
for i in 0..n {
258-
// TODO: Use get_unchecked_mut instead.
259-
// let ptr = unsafe { vec.get_unchecked_mut(i) };
260-
// if *ptr == old {
261-
// *ptr = new.clone();
262-
// }
263-
if vec[i] == old {
264-
vec[i] = new.clone();
247+
let ptr = unsafe { vec.get_unchecked_mut(i) };
248+
if *ptr == old {
249+
*ptr = new.clone();
265250
}
266251
}
267252
}
268253

269254
fn replace_na(&self, new: T) {
270255
let mut vec = self.values_mut();
271256
for i in self.na_indexes().iter() {
272-
// TODO: Use get_unchecked_mut instead.
273-
// let ptr = unsafe { vec.get_unchecked_mut(*i) };
274-
// *ptr = new.clone();
275-
vec[*i] = new.clone();
257+
let ptr = unsafe { vec.get_unchecked_mut(*i) };
258+
*ptr = new.clone();
276259
}
277260
self.na_indexes_mut().clear();
278261
}
@@ -282,19 +265,12 @@ where
282265
return Err(PyIndexError::new_err("Index out of range!"));
283266
}
284267
let mut vec = self.values_mut();
285-
// TODO: Use get_unchecked_mut instead.
286-
// let ptr = unsafe { vec.get_unchecked_mut(index) };
287-
// if let Some(i) = elem {
288-
// *ptr = i;
289-
// } else {
290-
// *ptr = self.na_value();
291-
// self.na_indexes_mut().insert(index);
292-
// }
268+
let ptr = unsafe{vec.get_unchecked_mut(index)};
293269
if let Some(i) = elem {
294-
vec[index] = i;
270+
*ptr = i;
295271
self.na_indexes_mut().remove(&index);
296272
} else {
297-
vec[index] = self.na_value();
273+
*ptr = self.na_value();
298274
self.na_indexes_mut().insert(index);
299275
}
300276
Ok(())

ulist/src/boolean.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use std::cell::RefMut;
1919
use std::collections::HashMap;
2020
use std::collections::HashSet;
2121
use std::ops::Fn;
22+
use std::cmp::max;
2223

2324
/// List with boolean type elements.
2425
#[pyclass]
@@ -57,7 +58,7 @@ impl BooleanList {
5758
self._check_len_eq(other)?;
5859
let hset1 = self.na_indexes();
5960
let hset2 = other.na_indexes();
60-
let mut hset: HashSet<usize> = HashSet::new();
61+
let mut hset: HashSet<usize> = HashSet::with_capacity(max(hset1.len(), hset2.len()));
6162
let vec = self
6263
.values()
6364
.iter()
@@ -83,6 +84,7 @@ impl BooleanList {
8384
}
8485
})
8586
.collect();
87+
hset.shrink_to_fit();
8688
Ok(BooleanList::new(vec, hset))
8789
}
8890

@@ -179,7 +181,7 @@ impl BooleanList {
179181
self._check_len_eq(other)?;
180182
let hset1 = self.na_indexes();
181183
let hset2 = other.na_indexes();
182-
let mut hset: HashSet<usize> = HashSet::new();
184+
let mut hset: HashSet<usize> = HashSet::with_capacity(max(hset1.len(), hset2.len()));
183185
let vec = self
184186
.values()
185187
.iter()
@@ -205,6 +207,7 @@ impl BooleanList {
205207
}
206208
})
207209
.collect();
210+
hset.shrink_to_fit();
208211
Ok(BooleanList::new(vec, hset))
209212
}
210213

ulist/src/control_flow.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ where
3434
}
3535

3636
let mut vec = vec![default; cond[0].size()];
37-
// for j in 0..cond[0].size() {
38-
for (j, item) in vec.iter_mut().enumerate().take(cond[0].size()) {
37+
for j in 0..vec.len() {
3938
for i in 0..cond.len() {
40-
// TODO: Improve the benchmark.
41-
if cond[i].get(j).unwrap().unwrap() {
42-
*item = choices[i].clone();
39+
let ptr = unsafe { cond.get_unchecked(i) };
40+
let choice = unsafe { choices.get_unchecked(i) };
41+
// TODO: implement iter() for BooleanList
42+
if ptr.get(j).unwrap().unwrap() {
43+
vec[j] = choice.clone();
4344
break;
4445
}
4546
}

ulist/src/floatings/float32.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ impl FloatList32 {
257257
vec.push(self.na_value());
258258
}
259259
// Construct List.
260-
let mut hset = HashSet::new();
260+
let mut hset = HashSet::with_capacity(1);
261261
if self.count_na() > 0 {
262262
hset.insert(vec.len() - 1);
263263
}

ulist/src/floatings/float64.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ impl FloatList64 {
257257
vec.push(self.na_value());
258258
}
259259
// Construct List.
260-
let mut hset = HashSet::new();
260+
let mut hset = HashSet::with_capacity(1);
261261
if self.count_na() > 0 {
262262
hset.insert(vec.len() - 1);
263263
}

ulist/src/index.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,8 @@ impl IndexList {
4949
pub fn to_list(&self) -> Vec<usize> {
5050
self._values.clone()
5151
}
52+
53+
pub fn size(&self) -> usize {
54+
self._values.len()
55+
}
5256
}

ulist/src/non_float.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ where
6565
}
6666
};
6767
// Construct List.
68-
let mut hset = HashSet::new();
68+
let mut hset = HashSet::with_capacity(1);
6969
if self.count_na() > 0 {
7070
hset.insert(vec_dedup.len() - 1);
7171
}

0 commit comments

Comments
 (0)