gh-89727: Improve os.walk complexity (#100671)

This commit is contained in:
Stanislav Zmiev 2023-01-03 01:41:19 +04:00 committed by GitHub
parent d7e7f79ca7
commit 73097d91a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 6 deletions

View File

@ -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")

View File

@ -0,0 +1 @@
Simplify and optimize :func:`os.walk` by using :func:`isinstance` checks to check the top of the stack.