我正在编写一些Python代码来实现我最近学习的一些概念,与倒排索引/发布列表相关。我对Python很陌生,在某些情况下我很难理解它的效率。
理论上,创建一组文档D的倒排索引,每个文档都有一个唯一的ID doc_id
,应该包含:
(word,doc_id)
对的列表{word:[set_of_all_doc_ids]}
(倒排索引)步骤5通常通过使包含具有元数据的单词的字典(术语频率,字节偏移)和指向发布列表的指针(其出现的文档列表)来执行。发布列表通常实现为允许有效随机插入的数据结构,即链表。
我的问题是Python是一种更高级的语言,直接使用内存指针(以及链接列表)之类的东西似乎超出了范围。我在分析之前进行了优化,因为对于非常大的数据集,已经知道必须最大化效率以保留在合理的时间内计算索引的任何能力。
这里有关于Python反向索引的其他几篇帖子,和我当前的实现一样,它们使用字典映射键到列表(或集合)。是否可以期望这种方法具有与允许直接编码链接列表指针的语言相似的性能?
答案 0 :(得分:2)
有很多话要说:
如果特定列表实施需要随机访问,链接列表 不是最佳(无论编程语言如何)用过的)。要访问列表的第i个元素,链接列表要求您从第0个元素到第i个元素一直迭代。相反,列表应存储为一个连续的块(如果它很长,则存储在几个大块中)。 Python列表[...]
以这种方式存储,所以首先,Python列表应该足够好。
在Python中,对象a = b
的任何作业 b
不是基本数据类型(例如int
或{{1 }}),由传递指针在内部执行,并将引用计数递增到float
。因此,如果b
是列表或字典(或者用户定义的类,就此而言),原则上与在C或C ++中传递指针没有多大区别。
但是,由于a)引用计数和b)垃圾收集,显然会出现一些开销。如果实现是出于研究目的,即更好地理解倒排索引的概念,我不会担心。但是对于严格的,高度优化的实现,使用纯Python(而不是嵌入到Python中的C / C ++)是不可取的。
当您进一步优化发布列表的实现时,您可能会看到需要a)进行随机插入,b)保持排序并c)保持压缩 - 所有这些都在同一时间。那时,标准Python列表将不再足够好,您可能希望在 C / C ++ 和嵌入中实现更优化的列表表示>进入Python。然而,即便如此,坚持使用纯Python也许是可能的。例如。您可以使用大字符串来实现列表,并使用itertools
和buffer
以某种方式访问特定部分,这在某种程度上类似于指针算法。
在处理Python 中的字符串时,您应该始终牢记的一点是,尽管我上面提到过有关赋值操作的内容, substring 操作b
涉及创建子字符串的实际(深层)副本,而不仅仅是递增引用计数。使用上面提到的text[i:j]
数据类型可以避免这种情况。
答案 1 :(得分:0)
您可以在以下位置查看Python中反向索引的代码和文档:http://www.ssiddique.info/creation-of-inverted-index-and-use-of-ranking-algorithm-python-code.html
很快我将用C ++编写它。