From 0e5674ffeabb4f911a9486da8ff3ba3a33d1d98c Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Sun, 8 Jan 2023 03:21:37 +0200 Subject: [PATCH] ls: compute relparts once for every dir Cuts down `dvc ls . data/mnist/dataset --recursive` for me from ~25 to ~12 seconds. `relparts` is an expensive operation as it calls `relpath` that calls `abspath`, so we want to avoid calling it as much as possible. --- dvc/repo/ls.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dvc/repo/ls.py b/dvc/repo/ls.py index 1b989095f..598fa4e44 100644 --- a/dvc/repo/ls.py +++ b/dvc/repo/ls.py @@ -70,11 +70,12 @@ def _ls( if not recursive: files.update(dirs) + parts = fs.path.relparts(root, fs_path) + if parts == (".",): + parts = () + for name, entry in files.items(): - entry_fs_path = fs.path.join(root, name) - relparts = fs.path.relparts(entry_fs_path, fs_path) - name = os.path.join(*relparts) - infos[name] = entry + infos[os.path.join(*parts, name)] = entry if not recursive: break