From 873070ad1468b60be487ffae2d8dbe1dcc1813c8 Mon Sep 17 00:00:00 2001 From: Bas Schoenmaeckers Date: Wed, 29 Jan 2025 11:01:44 +0100 Subject: [PATCH] Optimize `Iterator::count()` for `PyDict`, `PyList`, `PyTuple` & `PySet` --- newsfragments/4878.added.md | 3 ++- src/types/dict.rs | 16 ++++++++++++++++ src/types/frozenset.rs | 8 ++++++++ src/types/list.rs | 8 ++++++++ src/types/set.rs | 8 ++++++++ src/types/tuple.rs | 16 ++++++++++++++++ 6 files changed, 58 insertions(+), 1 deletion(-) diff --git a/newsfragments/4878.added.md b/newsfragments/4878.added.md index 040c6d860e5..0130b2b805b 100644 --- a/newsfragments/4878.added.md +++ b/newsfragments/4878.added.md @@ -1 +1,2 @@ -Optimizes `last` for `BoundListIterator`, `BoundTupleIterator` and `BorrowedTupleIterator` \ No newline at end of file +- Optimizes `last` for `BoundListIterator`, `BoundTupleIterator` and `BorrowedTupleIterator` +- Optimizes `Iterator::count()` for `PyDict`, `PyList`, `PyTuple` & `PySet` \ No newline at end of file diff --git a/src/types/dict.rs b/src/types/dict.rs index 0d2e6ff335f..1d6b477736c 100644 --- a/src/types/dict.rs +++ b/src/types/dict.rs @@ -534,6 +534,14 @@ impl<'py> Iterator for BoundDictIterator<'py> { (len, Some(len)) } + #[inline] + fn count(self) -> usize + where + Self: Sized, + { + self.len() + } + #[inline] #[cfg(Py_GIL_DISABLED)] fn fold(mut self, init: B, mut f: F) -> B @@ -736,6 +744,14 @@ mod borrowed_iter { let len = self.len(); (len, Some(len)) } + + #[inline] + fn count(self) -> usize + where + Self: Sized, + { + self.len() + } } impl ExactSizeIterator for BorrowedDictIter<'_, '_> { diff --git a/src/types/frozenset.rs b/src/types/frozenset.rs index 954c49b5902..ee9a9b11f1f 100644 --- a/src/types/frozenset.rs +++ b/src/types/frozenset.rs @@ -237,6 +237,14 @@ impl<'py> Iterator for BoundFrozenSetIterator<'py> { fn size_hint(&self) -> (usize, Option) { (self.remaining, Some(self.remaining)) } + + #[inline] + fn count(self) -> usize + where + Self: Sized, + { + self.len() + } } impl ExactSizeIterator for BoundFrozenSetIterator<'_> { diff --git a/src/types/list.rs b/src/types/list.rs index fc3395a10fe..8437218b523 100644 --- a/src/types/list.rs +++ b/src/types/list.rs @@ -695,6 +695,14 @@ impl<'py> Iterator for BoundListIterator<'py> { (len, Some(len)) } + #[inline] + fn count(self) -> usize + where + Self: Sized, + { + self.len() + } + #[inline] fn last(mut self) -> Option where diff --git a/src/types/set.rs b/src/types/set.rs index 60aa9428562..d502806e10e 100644 --- a/src/types/set.rs +++ b/src/types/set.rs @@ -267,6 +267,14 @@ impl<'py> Iterator for BoundSetIterator<'py> { fn size_hint(&self) -> (usize, Option) { (self.remaining, Some(self.remaining)) } + + #[inline] + fn count(self) -> usize + where + Self: Sized, + { + self.len() + } } impl ExactSizeIterator for BoundSetIterator<'_> { diff --git a/src/types/tuple.rs b/src/types/tuple.rs index c5aee55f654..98093f69893 100644 --- a/src/types/tuple.rs +++ b/src/types/tuple.rs @@ -377,6 +377,14 @@ impl<'py> Iterator for BoundTupleIterator<'py> { (len, Some(len)) } + #[inline] + fn count(self) -> usize + where + Self: Sized, + { + self.len() + } + #[inline] fn last(mut self) -> Option where @@ -557,6 +565,14 @@ impl<'a, 'py> Iterator for BorrowedTupleIterator<'a, 'py> { (len, Some(len)) } + #[inline] + fn count(self) -> usize + where + Self: Sized, + { + self.len() + } + #[inline] fn last(mut self) -> Option where