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

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

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

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

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

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

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

Вы знаете о каких-либо библиотеках дерева radix / patricia / crisbit, написанных как расширения C / 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% увеличение производительности .) )

12
задан Andrew Dalke 16 January 2011 в 23:48
поделиться