2015-12-30 75 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