From 15ab1a6be0265e992895922933a4ba2b4c0fa104 Mon Sep 17 00:00:00 2001 From: jfh Date: Sun, 25 Jul 2021 20:03:34 +0300 Subject: [PATCH] Improve set iteration speed. --- vm/src/builtins/set.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vm/src/builtins/set.rs b/vm/src/builtins/set.rs index 8d26c5e1a4..af5c02dcbc 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -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, + elements: Vec, size_info: AtomicCell, } @@ -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());