我有一个由1.9-2 百万个项目组成的字符串列表。
以下代码:
items = [...]
item_in_list = items[-1] in items
需要 0.1 秒
使用 sqlite3 需要 0.7 秒
现在问题是我需要执行此检查 100 万次,我想在几分钟内而不是几天内完成。
更准确地说,我正在尝试将 CSV 文件的内容与数据库中的计算值同步。
有什么想法吗?真的很棒 :)
最佳答案
将两个集合放入 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
如您所见,set 的速度呈指数级增长。性能也应该比字典好。
值得注意的是,我包括了制作布景所需的时间。这种开销也会影响您的性能,但除了一组比另一组小得多之外,您将获得很大的 yield 。
关于python - 在包含 200 万个项目的列表中搜索项目 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4453092/