我有一个由 1.9-2百万件组成的字符串列表。
以下代码:
items = [...]
item_in_list = items[-1] in items
0.1秒
使用 sqlite3 需要 0.7秒
现在问题是我需要执行此次检查100万次,我想在几分钟而不是几天内完成此操作。
更准确地说,我正在尝试将CSV文件的内容与数据库中的计算值同步。
任何想法?真的很棒:)。
答案 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)
你有两百万个字符串需要匹配一百万个其他字符串‽
要尝试的几件事情:
更新
如评论中所述,集合和dicts不使用二叉树,它们使用哈希表。这应该比列表更快,实际上甚至可能比二进制搜索更快。
答案 3 :(得分:0)
离开我的头顶,几乎没有关于你为什么这样做几百万次的信息:
1。)你可以将csv导入表中并在sql中进行检查吗?
2.。)如何对列表进行排序和索引以便快速访问?
欢呼声, P