2017-02-10 12 views
1

Как я могу заставить эту программу python быстрее читать большой текстовый файл? Мой код занимает почти пять минут, чтобы прочитать текстовый файл, но мне нужно, чтобы он делал это намного быстрее. Я думаю, что мой алгоритм не в O (n).Чтение текстового файла python происходит медленно

Некоторые примеры данных (установлено actual data является 470k + строк):

Aarika 
Aaron 
aaron 
Aaronic 
aaronic 
Aaronical 
Aaronite 
Aaronitic 
Aaron's-beard 
Aaronsburg 
Aaronson 

Мой код:

import string 
import re 


WORDLIST_FILENAME = "words.txt" 

def load_words(): 
wordlist = [] 
print("Loading word list from file...") 
with open(WORDLIST_FILENAME, 'r') as f: 
    for line in f: 
     wordlist = wordlist + str.split(line) 
print(" ", len(wordlist), "words loaded.") 
return wordlist 

def find_words(uletters): 
wordlist = load_words() 
foundList = [] 

for word in wordlist: 
    wordl = list(word) 
    letters = list(uletters) 
    count = 0 
    if len(word)==7: 
     for letter in wordl[:]: 
      if letter in letters: 
       wordl.remove(letter) 
       # print("word left" + str(wordl)) 
       letters.remove(letter)      
       # print(letters) 
       count = count + 1 
       #print(count) 
       if count == 7: 
        print("Matched:" + word) 
        foundList = foundList + str.split(word) 
foundList.sort() 
result = '' 
for items in foundList: 
     result = result + items + ',' 
print(result[:-1]) 


#Test cases 
find_words("eabauea" "iveabdi") 
#pattern = "asa" " qlocved" 
#print("letters to look for: "+ pattern) 
#find_words(pattern) 
+1

Похоже, лучше подходят для http://codereview.stackexchange.com/. – alecxe

+0

Если вы также можете объяснить, что ваша программа должна делать, это поможет. – MYGz

+0

Одна вещь ... 'wordlist = wordlist + str.split (строка)' копирует список слов в строке. Сделайте 'wordlist.extend (line.strip(). Split())'. Или, если вы хотите избавиться от дубликатов и быстрее выполнить поиск слов, сделайте 'wordlist'' 'set' и сделайте' .update'. – tdelaney

ответ

0

Прочитайте файл одноколоночный в список с splitlines():

def load_words(): 
    with open("words.txt", 'r') as f: 
     wordlist = f.read().splitlines() 
    return wordlist 

Вы можете сравнить его с timeit:

from timeit import timeit 

timeit('load_words()', setup=setup, number=3) 
# Output: 0.1708553659846075 seconds 

А как реализовать то, что выглядит как алгоритм нечеткого соответствия, вы можете попробовать fuzzywuzzy:

# pip install fuzzywuzzy[speedup] 

from fuzzywuzzy import process 

wordlist = load_words() 
process.extract("eabauea", wordlist, limit=10) 

Выход:

[('-a', 90), ('A', 90), ('A.', 90), ('a', 90), ("a'", 90), 
('a-', 90), ('a.', 90), ('AB', 90), ('Ab', 90), ('ab', 90)] 

Результаты более интересны, если вы фильтруете для более длительных совпадений:

results = process.extract("eabauea", wordlist, limit=100) 
[x for x in results if len(x[0]) > 4] 

Выход:

[('abaue', 83), 
('Ababua', 77), 
('Abatua', 77), 
('Bauera', 77), 
('baulea', 77), 
('abattue', 71), 
('abature', 71), 
('ablaqueate', 71), 
('bauleah', 71), 
('ebauche', 71), 
('habaera', 71), 
('reabuse', 71), 
('Sabaean', 71), 
('sabaean', 71), 
('Zabaean', 71), 
('-acea', 68)] 

Но с 470k + строк это займет некоторое время:

timeit('process.extract("eabauea", wordlist, limit=3)', setup=setup, number=3) 
# Output: 384.97334043699084 seconds