Merge pull request #2753 from DimitrisJim/set_iter

Make set iteration linear
This commit is contained in:
Jeong YunWon
2021-07-27 00:06:45 +09:00
committed by GitHub

View File

@@ -201,6 +201,7 @@ impl PySetInner {
PySetIterator {
dict: PyRc::clone(&self.content),
elements: self.content.keys(),
size_info: AtomicCell::new(set_size),
}
}
@@ -763,6 +764,7 @@ struct SetSizeInfo {
#[pyclass(module = false, name = "set_iterator")]
pub(crate) struct PySetIterator {
dict: PyRc<SetContentType>,
elements: Vec<PyObjectRef>,
size_info: AtomicCell<SetSizeInfo>,
}
@@ -796,8 +798,10 @@ impl PyIter for PySetIterator {
if let Some(set_size) = size_info.size {
if set_size == zelf.dict.len() {
let index = size_info.position;
let keys = zelf.dict.keys();
let item = keys.get(index).ok_or_else(|| vm.new_stop_iteration())?;
let item = zelf
.elements
.get(index)
.ok_or_else(|| vm.new_stop_iteration())?;
size_info.position += 1;
zelf.size_info.store(size_info);
return Ok(item.clone());