2013-09-02 5 views
0

Мне нужно найти все репозитории git в некоторых папках. Раньше я использовал find . -type -d -name .git. Теперь я переписал это в Python 3 и использовал os.walk. Похоже, что ему нужно пройти, чтобы пройти по дереву, чем просто find.Python 3 `os.walk` намного медленнее, чем простой` find -type d`

Как я могу ускорить это?

Вот полный код: oldnew

ответ

3

Есть много потоков о os.walk() на SO, он мертв медленно.

  • Вы можете быть заинтересованы в scandir (не знаю, если он по-прежнему относится к Python3)
  • Вместо того, чтобы ходить по всему дереву и фильтрацию для «.git», быть хорошей глава и использовать glob-module к найти их напрямую.
+0

Хорошо, но как я могу найти их на произвольной глубине в дереве файлов с помощью 'glob.glob'? –

0

Если вы имеете в виду реализацию find_repos(), то с помощью os.walk(), вероятно, не оптимально. Причина в том, что как только вы найдете подкаталог .git, нет необходимости искать глубже. Попробуйте написать собственный обход каталога. Вы можете взглянуть на источники в os.py на то, как реализован walk - причина для медлительности может быть написана на Python.

Для других частей вашего нового решения ... Я заметил, что вы не компилируете регулярные выражения, но я не проверял детали.

Предлагаю отделить функциональность от другого сценария Python, затем измерить решение с помощью модуля timeit, а затем попытаться оптимизировать.

+0

«Не нужно искать глубже» - это правда? Что относительно суб-репозиториев? – user2722968

+0

Вы используете субрепозитории внутри репозитория git? – pepr

+0

На самом деле я строю для этого. Я делаю это с помощью 'dirnames = []'. Подождите минуту ... это ничего не удалит в списке. Я изменю это. Хотя @pepr прав, у меня есть субрепозиторы. –

 Смежные вопросы

  • Нет связанных вопросов^_^