繁体   English   中英

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

[英]Search for item in list with 2MILLION items - Python

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

以下代码:

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

需要0.1秒

使用sqlite3需要0.7秒


现在问题是我需要进行100万次这种检查 ,我想在几分钟而不是几天内完成。

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


有任何想法吗? 会真的很棒:)

将两个集合放入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

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

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

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

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

有几件事要尝试:

  1. 对于这200万个项目,请使用集合而不是列表。
  2. 如果这不会加快速度,请尝试将字符串作为字典中的键。
  3. 如果这也没有帮助,请获得一个很好的二叉树实现并使用它。

更新:

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

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

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

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

欢呼声,P

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM