Я пишу некоторый код Python для реализации некоторых концепций, которые я недавно изучал, связанных с инвертированными списками индексов / публикаций. Я довольно новичок в Python и у меня возникают проблемы с пониманием его эффективности в некоторых случаях.
Теоретически, создание инвертированного индекса набора документов D, каждый с уникальным идентификатором doc_id
, должен включать:
- Анализ / выполнение лексического анализа каждого документа в D
- Удаление стоп-слов, выполнение стволов и т. Д.
- Создание списка всех
(word,doc_id)
пар
- Сортировка списка
- Сжатие дубликатов в
{word:[set_of_all_doc_ids]}
(инвертированный индекс)
Шаг 5 часто выполняется с помощью словаря, содержащего слово с метаданными (частота слова, смещение байтов) и указатель на список публикаций (список документов, в которых он встречается). Список проводок часто реализуется в виде структуры данных, которая обеспечивает эффективную случайную вставку, то есть связанный список.
Моя проблема в том, что Python - это язык более высокого уровня, и прямое использование таких вещей, как указатели памяти (и, следовательно, связанные списки), кажется, выходит за рамки. Я оптимизирую перед профилированием, потому что для очень больших наборов данных уже известно, что эффективность должна быть максимизирована, чтобы сохранить возможность расчета индекса в разумные сроки.
В SO здесь есть несколько других постов об инвертированных индексах Python, и, как и в текущей реализации MY, они используют словари, отображающие ключи в списки (или наборы). Можно ли ожидать, что этот метод имеет аналогичную производительность с языком, который позволяет прямое кодирование указателей на связанные списки?