Существуют ли какие-либо деревья radix/patricia/critbit для Python?

У меня около 10 000 слов, используемых в виде набора инвертированных индексов примерно для 500 000 документов. Оба нормированы, поэтому индекс представляет собой отображение целых чисел (word id) в набор целых чисел (идентификаторы документов, которые содержат слово).

Мой прототип использует Python как очевидный тип данных.

Когда я выполняю поиск документа, я нахожу список N поисковых слов и их соответствующих N наборов. Я хочу вернуть набор документов в пересечении тех N наборов.

Метод "пересекаться" Python реализуется как попарное восстановление. Я думаю, что я могу сделать лучше с параллельным поиском отсортированных наборов, если библиотека предлагает быстрый способ получить следующую запись после i.

Я искал что-то подобное в течение некоторого времени. Несколько лет назад я писал PyJudy, но я больше не поддерживаю его, и я знаю, сколько работы потребуется, чтобы довести его до стадии, m удобно с ним снова. Я предпочел бы использовать чей-то еще проверенный код, и я бы хотел, чтобы он поддерживал быструю сериализацию/десериализацию.

Я не могу найти ни одного или, по крайней мере, не с помощью связок Python. Существует avltree, который делает то, что я хочу, но так как даже слияние парных мутов занимает больше времени, чем я хочу, я подозреваю, что хочу все мои операции выполняются на C/С++.

Знаете ли вы какие-либо библиотеки дерева radix/patricia/critbit, написанные как расширения C/С++ для Python?

В противном случае, какая самая подходящая библиотека, которую я должен обернуть? Сайт Judy Array не обновлялся через 6 лет, а 1.0.5 выпущен в мае 2007 года. (Хотя он строит чисто так, возможно, это Просто работает.)

(Изменить: чтобы уточнить, что я ищу из API, мне нужно что-то вроде:

def merge(document_sets):
    probe_i = 0
    probe_set = document_sets[probe_i]
    document_id = GET_FIRST(probe_set)

    while IS_VALID(document_id):
        # See if the document is present in all sets
        for i in range(1, len(document_sets)):
            # dynamically adapt to favor the least matching set
            target_i = (i + probe_i) % len(document_sets)
            target = document_sets[target_i]
            if document_id not in target_set:
                probe_i = target_id
                probe_set = document_sets[probe_i]
                document_id = GET_NEXT(probe_set, document_id)
                break
        else:
            yield document_id

Я ищу что-то, что реализует GET_NEXT(), чтобы вернуть следующую запись, которая возникает после данной записи. Это соответствует Judy1N и аналогичным записям для других массивов Judy.

Этот алгоритм, динамически адаптируемый к данным, должен преимущественно использовать наборы с низкими хитами. Для типа данных, с которыми я работаю, это дает 5-10% увеличение производительности). )

Ответ 1

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

BioPython имеет реализацию Trie в C.

А, вот приятное обсуждение, включая тесты: http://bugs.python.org/issue9520

Другие (некоторые очень устаревшие) реализации:

http://pypi.python.org/pypi/radix

py-radix - это реализация структура данных дерева оснований для хранения и поиска IPv4 и IPv6 сетевые префиксы.

https://bitbucket.org/markon/patricia-tree/src

Выполнение Python Патрисия дерево

http://pypi.python.org/pypi/trie

Реализация дерева префикса (trie).

http://pypi.python.org/pypi/logilab-common/0.50.3

patricia.py: реализация Python PATRICIA trie (Практический алгоритм для получения информации, закодированной в Буквенно-цифровой).

Ответ 2

Недавно я добавил поддержку итерации datrie, вы можете попробовать.