From 6f7d1e9425251563c4c68578c04fa0c7a83af3bc Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 16 May 2024 21:05:00 -0500 Subject: [PATCH 1/4] Move try/except out of the inner loop. --- Doc/library/itertools.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index a19baa3f0e439f..c4172d08b0531f 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -698,18 +698,18 @@ loops that truncate the stream. def tee(iterable, n=2): iterator = iter(iterable) - empty_link = [None, None] # Singly linked list: [value, link] - return tuple(_tee(iterator, empty_link) for _ in range(n)) + initial_link = [None, None] # node: [data, link] + return tuple(_tee(iterator, initial_link) for _ in range(n)) def _tee(iterator, link): - while True: - if link[1] is None: - try: + try: + while True: + if link[1] is None: link[:] = [next(iterator), [None, None]] - except StopIteration: - return - value, link = link - yield value + value, link = link + yield value + except StopIteration: + return Once a :func:`tee` has been created, the original *iterable* should not be used anywhere else; otherwise, the *iterable* could get advanced without From 3bba6d8d4e33726c10b281ca4428379e4f34815a Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 18 May 2024 00:51:04 -0500 Subject: [PATCH 2/4] Rename to "shared_link" --- Doc/library/itertools.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index c4172d08b0531f..e19f946c708621 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -698,8 +698,8 @@ loops that truncate the stream. def tee(iterable, n=2): iterator = iter(iterable) - initial_link = [None, None] # node: [data, link] - return tuple(_tee(iterator, initial_link) for _ in range(n)) + shared_link = [None, None] # node: [data, link] + return tuple(_tee(iterator, shared_link) for _ in range(n)) def _tee(iterator, link): try: From 0758bbe16e5738281eddb65de863968d80b9f36f Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 18 May 2024 01:12:35 -0500 Subject: [PATCH 3/4] Simpler but slightly slower code --- Doc/library/itertools.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index e19f946c708621..c0693656a5e30f 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -705,7 +705,8 @@ loops that truncate the stream. try: while True: if link[1] is None: - link[:] = [next(iterator), [None, None]] + link[0] = next(iterator) + link[1] = [None, None] value, link = link yield value except StopIteration: From 8a8a142cd921c4e1f1d39088dfa51255509e77f8 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 18 May 2024 01:14:00 -0500 Subject: [PATCH 4/4] . --- Doc/library/itertools.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index c0693656a5e30f..6d33748898361d 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -698,7 +698,7 @@ loops that truncate the stream. def tee(iterable, n=2): iterator = iter(iterable) - shared_link = [None, None] # node: [data, link] + shared_link = [None, None] return tuple(_tee(iterator, shared_link) for _ in range(n)) def _tee(iterator, link):