2014-10-12 2 views
0

Я ищу, чтобы написать функцию, которая принимает список слов (список слов), открывает txt-файл и возвращает список слов, которые не отображаются в файле txt. Это то, что у меня есть до сих пор ...Сравнение слов из файла со списком слишком медленно

def check_words_in_file(wordlist): 
    """Return a list of words that don't appear in words.txt""" 
    words = set() 
    words = open("words.txt").read().splitlines() 

    return [x for x in wordlist if x not in words] 

Проблема, с которой я столкнулся, заключается в том, что она слишком медленная. Если я использую список слов, состоящий, например, из 10 000 слов, это займет около 15 секунд. Если я использую один с 300 000, он занимает больше времени, чем нужно. В любом случае, я могу сделать эту функцию быстрее?

+4

В дальнейшем попробуйте выбрать описательные заголовки. Если бы каждый, у кого вопрос с Python использовал «Программирование на Python» в качестве названия, у нас было бы почти 350 000 вопросов с тем же названием, и никто не мог найти ничего. –

ответ

7

Проблема с вашим пониманием использования переменных и ассоциирования с объектами, что видно, когда вы пишете

words = set() 
words = open("words.txt").read().splitlines() 

В первой строке, вы сначала создать пустой набор объектов и связать ссылку на него с переменной words. Позже вы открываете файл и разделить строки него содержание, которое возвращает список и перепривязывают переменную words со списком

Вы, вероятно, намеревался написать

words = set(open("words.txt").read().splitlines()) 

Дальнейшее улучшение

You на самом деле может быть лучше, если вы создадите набор аргументов wordlist и найдите асимметричную разность заданий

words = set(wordlist).difference(open("words.txt").read().splitlines()) 
return list(words) 

придираться

Это, как правило, не рекомендуется, чтобы открыть файл, и пусть обрабатывать файл будет мусора. Закройте файл или используйте контекстный менеджер

with open("words.txt") as fin: 
    from itertools import imap 
    words = set(wordlist).difference(imap(str.strip, fin)) 
    return list(words) 
+0

Большое вам спасибо за разъяснение! Cheers –

Смежные вопросы