Краткий ответ - «нет». Вы не сможете построить систему индексации в Python, которая опередит файловую систему на порядок.
«Индексация» файловой системы - интенсивная / медленная задача, независимо от реализации кэширования. Единственный реальный способ избежать огромных накладных расходов на создание индексов файловой системы - это «индексировать по ходу», чтобы избежать большого обхода. (В конце концов, сама файловая система уже является индексатором данных.)
Существуют функции операционной системы, которые могут выполнять индексацию файловой системы "строим по мере того, как вы идете". Это основа таких сервисов, как Spotlight для OSX и Windows Desktop Search.
Чтобы надеяться получить более высокую скорость, чем обходить каталоги, вам нужно использовать один из этих инструментов на уровне ОС или файловой системы.
Кроме того, постарайтесь не вводить себя в заблуждение, думая, что решения быстрее, потому что вы «переместили» работу в другое время / процесс. Ваш пример кода делает именно это. Вы просматриваете структуру каталогов ваших примеров файлов , в то время как вы создаете те же файлы и создаете индекс, а затем просто читаете этот файл.
Здесь есть два урока. (а) Для создания правильного теста важно отделить «настройку» от «теста». Здесь ваш тест производительности по сути говорит: «Что быстрее, обход структуры каталогов или чтение индекса, который уже был создан заранее?» Очевидно, это не сравнение яблок с апельсинами.
Однако, (b) вы наткнулись на правильный ответ в то же время. Вы можете получить список файлов намного быстрее , если используете уже существующий индекс . Здесь вам нужно использовать что-то вроде индексов Windows Desktop Search или Spotlight.
Не заблуждайтесь, чтобы построить индекс файловой системы, вы должны, по определению, "посетить" каждый файл. Если ваши файлы хранятся в дереве, то рекурсивный обход, вероятно, будет самым быстрым способом доступа к каждому файлу. Если вопрос «могу ли я написать код Python, чтобы точно делать то, что делает os.walk
, но быть на порядок быстрее, чем os.walk
», то ответом будет no . Если вопрос «могу ли я написать код Python для индексации каждого файла в системе, не тратя время на фактическое посещение каждого файла», то ответ по-прежнему нет .
( Редактировать в ответ на "Я не думаю, что вы понимаете, что я пытаюсь сделать" )
Давайте проясним это, практически все здесь понимают, что вы пытаетесь сделать. Кажется, вы принимаете «нет, это не сработает так, как вы хотите, чтобы это работало», что означает, что мы не понимаем.
Давайте посмотрим на это с другой стороны. Файловые системы с самого начала были важным компонентом современных вычислений. Категоризация, индексация, хранение и поиск данных являются серьезной частью информатики и вычислительной техники, и многие из самых блестящих умов в информатике постоянно работают над этим.
Вы хотите иметь возможность фильтровать / выбирать файлы на основе атрибутов / метаданных / данных файлов. Это чрезвычайно распространенная задача, постоянно используемая в вычислительной технике. Вероятно, это происходит несколько раз в секунду даже на компьютере, с которым вы сейчас работаете.
Если бы было так просто ускорить этот процесс на порядок (!), Просто сохраняя в текстовом файле индекс имен файлов и атрибутов, разве вы не думаете, что каждая отдельная файловая система и операционная система в Существование сделает именно это?
При этом, конечно, кэширование результатов ваших конкретных запросов может привести к небольшому увеличению производительности. И, как и ожидалось, файловая система и дисковое кэширование являются фундаментальной частью любой современной операционной системы и файловой системы.
Но на ваш вопрос, как вы его задали, есть четкий ответ: Нет . В общем случае вы не получите на порядок быстрее переопределения os.walk
. Возможно, вам удастся добиться лучшего амортизируемого времени выполнения с помощью кэширования, но вы не сможете превзойти его на порядок, если правильно включите работу по созданию кэша в свой профилирование.