From: Stanislav Zmiev Date: Mon, 2 Jan 2023 21:41:19 +0000 (+0400) Subject: gh-89727: Improve os.walk complexity (#100671) X-Git-Tag: v3.12.0a4~70 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=73097d91a64620ae7f620705864b84234d85cc82;p=thirdparty%2FPython%2Fcpython.git gh-89727: Improve os.walk complexity (#100671) --- diff --git a/Lib/os.py b/Lib/os.py index 73a5442ee8b8..598c9e502301 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -341,11 +341,11 @@ def walk(top, topdown=True, onerror=None, followlinks=False): """ sys.audit("os.walk", top, topdown, onerror, followlinks) - stack = [(False, fspath(top))] + stack = [fspath(top)] islink, join = path.islink, path.join while stack: - must_yield, top = stack.pop() - if must_yield: + top = stack.pop() + if isinstance(top, tuple): yield top continue @@ -422,13 +422,13 @@ def walk(top, topdown=True, onerror=None, followlinks=False): # the caller can replace the directory entry during the "yield" # above. if followlinks or not islink(new_path): - stack.append((False, new_path)) + stack.append(new_path) else: # Yield after sub-directory traversal if going bottom up - stack.append((True, (top, dirs, nondirs))) + stack.append((top, dirs, nondirs)) # Traverse into sub-directories for new_path in reversed(walk_dirs): - stack.append((False, new_path)) + stack.append(new_path) __all__.append("walk") diff --git a/Misc/NEWS.d/next/Library/2023-01-01-23-57-00.gh-issue-89727.ojedHN.rst b/Misc/NEWS.d/next/Library/2023-01-01-23-57-00.gh-issue-89727.ojedHN.rst new file mode 100644 index 000000000000..38c0d5c4d5fb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-01-01-23-57-00.gh-issue-89727.ojedHN.rst @@ -0,0 +1 @@ +Simplify and optimize :func:`os.walk` by using :func:`isinstance` checks to check the top of the stack.