diff options
author | Stefan Pochmann <609905+pochmann@users.noreply.github.com> | 2023-03-02 03:16:23 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-02 03:16:23 (GMT) |
commit | eaae563b6878aa050b4ad406b67728b6b066220e (patch) | |
tree | b1bd7d9491f50264244b8a3f5f3eda0e32d78687 | |
parent | 2f62a5da949cd368a9498e6a03e700f4629fa97f (diff) | |
download | cpython-eaae563b6878aa050b4ad406b67728b6b066220e.zip cpython-eaae563b6878aa050b4ad406b67728b6b066220e.tar.gz cpython-eaae563b6878aa050b4ad406b67728b6b066220e.tar.bz2 |
gh-102088 Optimize iter_index itertools recipe (GH-102360)
-rw-r--r-- | Doc/library/itertools.rst | 9 | ||||
-rw-r--r-- | Lib/test/test_operator.py | 3 |
2 files changed, 9 insertions, 3 deletions
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 95da716..d85a17e 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -886,9 +886,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 b7e38c2..1db738d 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 |