【问题标题】:reading strings from large file faster更快地从大文件中读取字符串
【发布时间】:2015-12-30 17:21:30
【问题描述】:

我有一个大文本文件 (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 行检查可能会更快。有没有更好的想法以及如何实施?

【问题讨论】:

  • 考虑只读取和解析文件一次。将其内容存储在字典中以便快速查找。其余的数据也可以解析成更友好的东西。

标签: python string file file-io


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 2015-06-24
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多