使用2MILLION项目搜索列表中的项目 - Python

时间:2010-12-15 17:41:46

标签: python sql django sqlite search

我有一个由 1.9-2百万件组成的字符串列表。

以下代码:

items = [...]
item_in_list = items[-1] in items

0.1秒

使用 sqlite3 需要 0.7秒


现在问题是我需要执行此次检查100万次,我想在几分钟而不是几天内完成此操作。

更准确地说,我正在尝试将CS​​V文件的内容与数据库中的计算值同步。


任何想法?真的很棒:)。

4 个答案:

答案 0 :(得分:4)

将两个集合放入frozensets。

小小的性能测试:

import random
from timeit import Timer

def random_strings(size):
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    min = 3
    max = 8
    strings = []
    for count in xrange(1, size):
        current = ''
        for x in random.sample(alpha, random.randint(min,max)):
            current += x  
        strings.append(current)
    return strings

string_list_1 = random_strings(10000)
string_list_2 = random_strings(10000)

def string_test():
    common = filter(lambda x: x in string_list_2, string_list_1)
    return common

def set_test():
    string_set_1 = frozenset(string_list_1)
    string_set_2 = frozenset(string_list_2)
    common = string_set_1 & string_set_2
    return common

string_timer = Timer("__main__.string_test()", "import __main__")
set_timer = Timer("__main__.set_test()", "import __main__")
print string_timer.timeit(10)
# 22.6108954005
print set_timer.timeit(10)
#  0.0226439453

如您所见,设置指数级更快。也应该比字典表现更好。

重要的是,我包括制作套装所需的时间。这种开销也会影响你的性能,但除了一套比另一套小得多之外,你将获得很大的收益。

答案 1 :(得分:1)

对于像这样的搜索,我会选择二进制搜索。长SORTED列表的禁食方法之一。如果没有排序,则不要使用二进制搜索。

答案 2 :(得分:0)

你有两百万个字符串需要匹配一百万个其他字符串‽

要尝试的几件事情:

  1. 对这200万件物品使用一套而不是一份清单。
  2. 如果这不能加快速度,请尝试将字符串作为字典中的键。
  3. 如果这也没有用,请获取一个不错的二叉树实现并使用它。
  4. 更新

    如评论中所述,集合和dicts不使用二叉树,它们使用哈希表。这应该比列表更快,实际上甚至可能比二进制搜索更快。

答案 3 :(得分:0)

离开我的头顶,几乎没有关于你为什么这样做几百万次的信息:

1。)你可以将csv导入表中并在sql中进行检查吗?

2.。)如何对列表进行排序和索引以便快速访问?

欢呼声, P