cpython
cpython copied to clipboard
GH-119169: Speed up `os.walk()`
Handle errors from os.scandir() and ScandirIterator similarly, which lets us loop over directory entries with for. In top-down mode, call os.path.join() at most once per iteration.
$ ./python -m timeit -s "import os" "list(os.walk('.', topdown=True))"
10 loops, best of 5: 37.1 msec per loop # before
10 loops, best of 5: 35.3 msec per loop # after
# --> 1.05x faster
$ ./python -m timeit -s "import os" "list(os.walk('.', topdown=False))"
10 loops, best of 5: 31.1 msec per loop # before
10 loops, best of 5: 29.9 msec per loop # after
# --> 1.04x faster
- Issue: gh-119169
cc @serhiy-storchaka
#119473 fixes the test failure.
Closing because reversing sibling traversal order isn't kosher - see discussion on #119473.