code: def _walk(top):
      
      dirs = []
      nondirs = []
  
      try:
          scandir_iter = scandir(top)
      except OSError:
          return
  
      # Avoid repeated global lookups.
      get_next = next
  
      while True:
          try:
              entry = get_next(scandir_iter)
          except StopIteration:
              break
          except OSError:
              return
  
          try:
              is_dir = entry.is_dir()
          except OSError:
              is_dir = False
  
          if is_dir:
              dirs.append(entry)
          else:
              nondirs.append(entry)
  
      yield top, dirs, nondirs
  
      for dir_entry in dirs:
          for entry in walk(dir_entry.path):
              yield entry
docs: Modified version of https://docs.python.org/3/library/os.html#os.scandir
      that returns https://docs.python.org/3/library/os.html#os.DirEntry for files
      directly to take advantage of possible cached os.stat calls.