Ваша проблема гораздо проще решить. Вы не поняли, что можете прочитать весь список в памяти по очень скромной цене - ваш файл меньше 1 МБ, он отлично помещается в памяти.
Решением вашей проблемы является чтение всего объекта в массив и использование стандартных методов списка для поиска членства:
# this is the only thing you need to get all the words in memory
words = [w.strip() for w in open("words.txt", "rb").readlines()]
# this is the only thing you need to find wether a word is in the list
print 'aaron' in words
# returns 'True'
# now you can go around many times and ask for membership of any word,
# or any list of words (use a loop) - the array is already in memory
# and will stay there until you close the program - it's only 1 mega!
Можно утверждать, что мое решение не является умным, но я думаю, что оно практично - преждевременная оптимизация - корень всего зла , и, пытаясь написать умный цикл, вы упускаете совершенно простой подход, который с учетом вашей проблемы работает отлично (кстати, первый вызов функции занимает меньше секунды для текстового файла из 60 тысяч слов, каждый поиск также чрезвычайно быстр) .
Обратите внимание: вам не нужен set
(вам все равно, если слово повторяется - ответ тот же).
Не решайте не ту проблему!
PS. Многие люди думают, что 58 тыс. Слов - это «много» - это (58 + средняя длина) кБ (если слова ~ 10 букв каждое, это 580 кБ - около половины мегабайта). Когда я слышу, как люди говорят, что вы не должны открывать это в памяти, я удивляюсь, как они открывают свои фотографии! Это парадигма, которую нужно сломать. Люди будут требовать «, но ваша программа не является надежной, потому что, если список станет 100 миллионами строк, он сломает », и это справедливо в мире, где английский язык увеличит свой словарный запас на 10 порядков величина. Мы часто забываем, что general означает general для вашего домена .
Редактировать : Согласно комментариям @Chinmay, использование набора над списком имеет серьезные последствия для доступа. Используя список из 58 тысяч слов, я выполнил два 1000 упражнения на доступ: list
и set
(время доступа в микросекундах):
container min max mean
list 3 1646 724.4
set 1 31 1.6
Итак, как указывает @Chinmay, среднее время доступа для набора почти на три порядка меньше. Это может иметь значение, если вы обращаетесь к словам много раз (что вы, вероятно, и есть).
Итак, я исправил и изменил код так:
# create a set of words
words = set(w.strip() for w in open('file.txt').readlines())
# test access using the `in` operator, as :
'aaron' in words
# will return True
Моя точка зрения остается: решение этой проблемы намного проще, чем создание class
для реализации оператора членства.