我的原型使用Python的set作为明显的数据类型。
当我搜索文档时,我找到N个搜索词及其对应的N个集合列表。我想返回这些N个集合的交集中的文档集合。
Python的“intersect”方法是通过成对的缩减来实现的。我认为,使用排序集合的并行搜索可以做得更好,只要库提供了一种快速获取i之后下一个条目的方法。
我一直在寻找这样的东西。多年前,我写了PyJudy,但我不再维护它,我知道需要多少工作才能让它再次达到我满意的阶段。我宁愿使用经过充分测试的其他人的代码,并且我希望支持快速序列化/反序列化的代码。
我找不到任何一个,或者至少没有Python绑定的任何一个。有avltree可以实现我想要的功能,但由于即使成对的集合合并也需要比我想要的时间长,我怀疑我想要在C/C++中完成所有操作。
您是否知道任何用作Python的C/C++扩展编写的基数/帕特里夏/克里特比特树库?
如果这样不行,我应该包装哪个最合适的库呢?Judy Array网站已经6年没有更新了,1.0.5版本是在2007年5月发布的。(虽然它可以干净地构建,所以也许它可以正常工作。)(编辑:为了澄清我从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%。