From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Thu, 2 Mar 2023 03:52:37 +0000 (-0800) Subject: [3.11] gh-102088 Optimize iter_index itertools recipe (GH-102360) (GH-102363) X-Git-Tag: v3.11.3~95 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3effccee48c4e324e6f0e8fe20dc03950166bb5c;p=thirdparty%2FPython%2Fcpython.git [3.11] gh-102088 Optimize iter_index itertools recipe (GH-102360) (GH-102363) --- diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 2fd30db0587f..5fe93fd3e0e5 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -875,9 +875,12 @@ which incur interpreter overhead. except AttributeError: # Slow path for general iterables it = islice(iterable, start, None) - for i, element in enumerate(it, start): - if element is value or element == value: - yield i + i = start - 1 + try: + while True: + yield (i := i + operator.indexOf(it, value) + 1) + except ValueError: + pass else: # Fast path for sequences i = start - 1 diff --git a/Lib/test/test_operator.py b/Lib/test/test_operator.py index b7e38c233498..1db738d228b1 100644 --- a/Lib/test/test_operator.py +++ b/Lib/test/test_operator.py @@ -208,6 +208,9 @@ class OperatorTestCase: nan = float("nan") self.assertEqual(operator.indexOf([nan, nan, 21], nan), 0) self.assertEqual(operator.indexOf([{}, 1, {}, 2], {}), 0) + it = iter('leave the iterator at exactly the position after the match') + self.assertEqual(operator.indexOf(it, 'a'), 2) + self.assertEqual(next(it), 'v') def test_invert(self): operator = self.module