2015-12-30 105 views
0

我有一個很大的文本文件(parsed.txt),其中包含近1.500.000行。每一行的格式如下:從大文件中讀取字符串的速度更快

foobar foo[Noun]+lAr[A3pl]+[Pnon]+[Nom] 
loremipsum lorem[A1sg]+lAr[A3pl]+[Pl]+[Nom] 

我給空間之後的第二場,並用此功能空間之前拿到第一場:

def find_postag(word,postag): 
    with open('parsed.txt',"r") as zemberek:  
     for line in zemberek: 
      if all(i in line for i in (word,postag)): 
       if line.split(" ")[0].startswith(word) and line.split(" ")[1] == word+postag: 
        selectedword = line.split(" ")[0] 
        break 
     return selectedword 

然而,它的工作速度太慢。我不確定我怎樣才能讓這個過程更快。我的想法是:parsed.txt文件是按字母順序排列的。如果給出word變量以「z」字母開頭,則它會不必要地讀取近900.000行。如果給定的word以「z」字母開頭,它可能會更快,如果它將檢查900.000行。有沒有更好的想法,我該如何實施?

+0

考慮閱讀和分析文件只有一次。將其內容存儲在字典中以進行快速查找。其餘的數據也可以被解析爲更友好的東西。 –

回答

1

由於您的輸入文件是按字母順序排列,你可以做的是創建一個包含每個字母開頭的行號,這樣一本字典:

with open('parsed.txt', 'r') as f: 
    data = [line.strip() for line in f if line.strip()] 

index = dict() 
for i in range(len(data)): 
    line = data[i] 
    first_letter = line[0].lower() 
    if first_letter not in index: 
     index[first_letter] = i 

您想在開頭,以便添加代碼它只會在您開始搜索之前運行一次。當你搜索一個詞這樣一來,你可以把它開始尋找它的第一個字母開始的地方,像這樣:

def find_postag(word, postag): 
    start = index[word[0].lower()] 
    for line in data[start:]: 
     # your code here 
     if all(i in line for i in (word,postag)): 
      if line.split(" ")[0].startswith(word) and line.split(" ")[1] == word+postag: 
       selectedword = line.split(" ")[0] 
       break 
    return selectedword