From 440ba3af85349324c86f92715338924c54c019b9 Mon Sep 17 00:00:00 2001 From: Philippe-Cholet <44676486+Philippe-Cholet@users.noreply.github.com> Date: Fri, 29 Mar 2024 09:40:05 +0100 Subject: [PATCH 1/2] k_smallest(0) and variants: consume the iterator The iterator can have side effects so I think it should be consumed in all cases, even k=0. If there are no side-effect then maybe the compiler will optimize it away. --- src/k_smallest.rs | 1 + src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/k_smallest.rs b/src/k_smallest.rs index b909887f5..97f0ee02a 100644 --- a/src/k_smallest.rs +++ b/src/k_smallest.rs @@ -42,6 +42,7 @@ where } if k == 0 { + iter.last(); return Vec::new(); } let mut iter = iter.fuse(); diff --git a/src/lib.rs b/src/lib.rs index a297a6d80..65909fcdd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2972,6 +2972,7 @@ pub trait Itertools: Iterator { use alloc::collections::BinaryHeap; if k == 0 { + self.last(); return Vec::new().into_iter(); } From 80c2b304518aaff534922a923d7eb04ef986a78d Mon Sep 17 00:00:00 2001 From: Philippe-Cholet <44676486+Philippe-Cholet@users.noreply.github.com> Date: Fri, 29 Mar 2024 09:44:28 +0100 Subject: [PATCH 2/2] k_smallest(1) and variants: use `min[_by]` Like with `tail(1)`, I think we should leverage a possible faster specialization. --- src/k_smallest.rs | 3 +++ src/lib.rs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/k_smallest.rs b/src/k_smallest.rs index 97f0ee02a..7b2f62ea1 100644 --- a/src/k_smallest.rs +++ b/src/k_smallest.rs @@ -45,6 +45,9 @@ where iter.last(); return Vec::new(); } + if k == 1 { + return iter.min_by(comparator).into_iter().collect(); + } let mut iter = iter.fuse(); let mut storage: Vec = iter.by_ref().take(k).collect(); diff --git a/src/lib.rs b/src/lib.rs index 65909fcdd..ff14cf94e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2975,6 +2975,9 @@ pub trait Itertools: Iterator { self.last(); return Vec::new().into_iter(); } + if k == 1 { + return self.min().into_iter().collect_vec().into_iter(); + } let mut iter = self.fuse(); let mut heap: BinaryHeap<_> = iter.by_ref().take(k).collect();