Однако set оказался лучше… И нечего парится с СУБД, если нужно всего лишь узнать есть слово там, или нет.
# coding: utf-8
import bisect
import random
import timeit
chars = u'qwertyuiopasdfghjklzxcvbnm_01234567890'
def create_word():
w = u''
for n in range(random.randint(3, 13)):
w += random.choice(chars)
return w
def create_list_of_words(count_of_words):
l = []
for i in xrange(count_of_words):
bisect.insort(l, create_word())
return l
l = create_list_of_words(500000)
setup = '''
from __main__ import create_word, l
import bisect
w = create_word()
bisect.insort(l, w)
'''
stmt = '''
bisect.bisect(l, w)
'''
timer = timeit.Timer(stmt, setup)
print (sum(timer.repeat(100, 1000)) / 100) / 1000 # среднее значение времени поиска
def create_set_of_words(count_of_words):
s = set()
for i in xrange(count_of_words):
s.add(create_word())
return s
s = create_set_of_words(500000)
setup = '''
from __main__ import create_word, s
import bisect
w = create_word()
s.add(w)
'''
stmt = '''
w in s
'''
timer = timeit.Timer(stmt, setup)
print (sum(timer.repeat(100, 1000)) / 100) / 1000
P.S. Не пугайтесь, выполняется долго – создание такого количества слов, это вам не два к двум прибавить…
P.P.S. Да, пример с set не совсем корректный, потому что он не держит повторяющихся слов… Но я не думаю, что их не будет в реале…