我有一个包含 2000 万个名字的文本文件,每个名字在一行中。例如,现在我想在该列表中找到名称“peter”。
我的第一个方法是使用 PyMongo 并创建一个索引,效果很好。但是,我想要尽可能快的搜索。
由于列表是静态的并且永远不会改变,我认为可以将列表加载到变量中并对其进行迭代。然而,与 MongoDB 相比,它非常慢。大约 1 次搜索 = 1 秒。
def initList(self):
global list
data = []
with open('list.txt','r') as f:
for x in f:
x = x.strip()
data.append(x)
list = [i for i, _ in enumerate(data)]
print("All names loaded.")
然后是搜索代码:
global list
if name in list or surname in list:
print(x)
现在我的问题是,我是否遗漏了什么,或者为什么列表方法这么慢? 最终最快的解决方案是什么?
我的下一步将是多处理。
您的方法需要一一检查名称。这给出了 O(n) 次比较。数据库使用索引,因此它们的所有名称都按字母顺序排列。这提供了使搜索更快的能力 - O(log(n)) 因为它们将列表分成两部分,并且在将提供的名称与中间元素进行比较后立即知道哪一半元素肯定不包含它。然后他们用剩下的一半重复这个。这大大减少了比较的次数。 Python 提供了 dict 数据结构。它使用不同的方法,但也非常有效。您可以在此处找到一些详细信息on StackOverflow
与使用索引的数据库搜索相比,多处理不会有太大的优势。
这行代码不是用来索引的吗? list = [i for i, _ in enumerate(data)]
我认为没有数据库的解决方案应该更快,因为变量在内存中?