Предполагая, что данное дерево каталогов имеет разумный размер: скажем, проект с открытым исходным кодом, такой как Twisted или Python, что является самым быстрым способом прохождения и перебора по абсолютному пути всех файлов/каталогов внутри этого каталога?Достаточно быстрый способ перемещения дерева каталогов в Python?
Я хочу сделать это изнутри Python. os.path.walk медленный. Поэтому я попробовал ls -lR и tree -fi. Для проекта с около 8337 файлов (включая ТМР, рус, тест, .svn файлы):
$ time tree -fi > /dev/null
real 0m0.170s
user 0m0.044s
sys 0m0.123s
$ time ls -lR > /dev/null
real 0m0.292s
user 0m0.138s
sys 0m0.152s
$ time find . > /dev/null
real 0m0.074s
user 0m0.017s
sys 0m0.056s
$
tree
, кажется, быстрее, чем ls -lR
(хотя ls -R
быстрее, чем tree
, но это не дает полного пути) , find
является самым быстрым.
Может ли кто-нибудь подумать о более быстром и/или улучшенном подходе? В Windows я могу просто отправить 32-битный двоичный файл tree.exe или ls.exe, если это необходимо.
Update 1: Добавлено find
Update 2: Почему я хочу, чтобы это сделать? ... Я пытаюсь сделать умную замену для команд cd, pushd и т. Д. И оболочки для других команд, полагающихся на проходящие пути (меньше, больше, cat, vim, tail). Иногда программа будет использовать обход файлов (например: «cd sr grai pat lxml» автоматически переводится на «cd src/pypm/grail/patches/lxml»). Я не буду удовлетворен, если эта замена cd займет, скажем, полсекунды, чтобы бежать. См. http://github.com/srid/pf
Это кажется очень странная вещь, чтобы оптимизировать. Что вы делаете, это критически важная операция? Вы профилировали и изучали ваши алгоритмы и определили, что это проблема? Даже «большое» дерево каталогов, такое как Twisted's, вряд ли велик. –
@Mike: background: Я пытаюсь сделать умную замену для cd, pushd и т. Д. И оболочку для других команд, полагающихся на проходящие пути (меньше, больше, cat, vim). Иногда программа будет использовать обход файлов (например: «cd sr grai pat lxml» автоматически переводится на «cd src/pypm/grail/patches/lxml»). Я не буду удовлетворен, если эта замена «cd» заняла, скажем, полсекунды, чтобы бежать. http://github.com/srid/pf –
, тогда мы вернемся к алгоритмике; исправление пути лучше всего подойти кусочно, а не «получить все дерево и сопоставить с ним», потому что ваш поиск, установленный для каждого компонента пути, является небольшим. Керниган и Пайк имеют классический интерактивный корректор пути в среде программирования Unix - найдите spdist() http://netlib.bell-labs.com/cm/cs/upe/ – msw