2014-10-12 1 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

향후 설명 제목을 선택하십시오. 파이썬 질문을 가진 모든 사람들이 "Programming in Python"을 제목으로 사용하면 동일한 제목의 질문이 거의 35 만 개가되며 아무도 찾을 수 없습니다. –

답변

7

문제는 당신이 첫 번째 줄에서

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

을 쓸 때 분명 당신의 변수 사용의 이해와 객체와 관련,와 함께, 당신은 처음에 빈 집합 객체를 만들고 그것의 참조를 연결 변수는 words입니다. 나중에 파일을 열 및 콘텐츠 그것의 라인을 분할, 목록을 반환하고

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

또한 개선을

당신을 작성하는 당신은 아마위한

목록에 변수 words를 리 바인드 인수 집합을 만들어 wordlist을 만들고 비대칭 집합 차이를 찾으면 실제로 더 잘할 수 있습니다.

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

일반적으로 파일을 열고 파일이 쓰레기 수집 처리 할 수 ​​있도록 권고하지 않습니다

Nitpick. 파일을 닫거나 컨텍스트 관리자를 사용하십시오.

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

해명 해 주셔서 감사합니다. 건배 –