2013-06-15 3 views
4

이 프로그램은 문자 조합을 생성하고 단어인지 확인하기 위해 프로그램을 작성하지만 초당 몇 단어 만 생성하는 속도가 매우 느립니다. 매우 느린 이유를 말해, 내가 더 빨리 만들 필요가 무엇인지하시기 바랍니다python 프로그램이 매우 느림

import itertools 

for p1 in itertools.combinations('abcdefghijklmnopqrstuvwxyz', 4): 
    with open('/Users/kyle/Documents/english words.txt') as word_file: 
     english_words = set(word.strip().lower() for word in word_file) 

    def is_english_word(word): 
     return word.lower() in english_words 

    print ''.join(p1),"is", is_english_word(''.join(p1)) 
+0

단어 목록의 크기는 얼마나됩니까? 조합 당 한 번 읽는 중입니다. –

+0

단어 목록은 모든 영어 단어 목록입니다. –

답변

13

각 루프 반복에 대한 파일 을 다시 읽고, 새로운 함수 객체를 생성하기 때문에 그것은 느립니다. 이 두 가지 모두 루프 변수에 의존하지 않습니다. 루프 밖으로 이동하여 한 번을 실행하십시오.

또한 간단한 함수를 인라인 할 수 있습니다. 함수를 호출하는 것은 비교적 비싸다. 그리고 ''.join() 번을 두 번 호출하지 마십시오. 그리고 당신은 단지 단어를 생성하기 위해 소문자를 사용하고, 그래서 .lower()는 중복 : 당신은 길이 4의 단어를 생성하기 때문에

with open('/Users/kyle/Documents/english words.txt') as word_file: 
    english_words = set(word.strip().lower() for word in word_file) 

for p1 in itertools.combinations('abcdefghijklmnopqrstuvwxyz', 4): 
    word = ''.join(p1) 
    print '{} is {}'.format(word, word in english_words) 

, 당신은 당신의 영어 단어에서 길이 4의 단어를로드하여 자신에게 약간의 메모리를 절약 할 수 파일 :

with open('/Users/kyle/Documents/english words.txt') as word_file: 
    english_words = set(word.strip().lower() for word in word_file if len(word.strip()) == 4) 
+0

고맙습니다. 최대한 빨리 답변을 수락하겠습니다. –

+0

고마워요. 잘 작동합니다. 어떻게하면 '사실'인 단어 만 표시되거나 잘못된 곳인지 물어볼 수 있습니다. "프로그래밍 퍼즐 및 코드 골프"사이트에 질문해야한다고 생각합니다. –

+0

'if' 테스트를 사용 하시겠습니까? '만약에 영어로한다면 : print word' 대신에'print word'를 사용 하시겠습니까? 정확히하기가 어렵지 않습니다. –