考虑您有两个列表,第一个包含700个单词,第二个包含30.000个可能的句子开头。将有21.000.000句子开头和单词的组合。

此外,大约有400个文件,每个可能的句子+单词组合都有一些结果。每个文件包含170.000.000行,其结构如下:

this is the first sentence
    1. result for that sentence
    2. result for that sentence
    ...
    nth result for that sentence

this is the second sentence
    ...

this is the nth sentence
    ...


对于每个可能的句子+单词组合,我想找到包含有关组合的某些信息的结果文件(对于每个组合,只有一个结果文件会出现组合)并读出结果。您可以在for循环中执行此操作:

all_results = []

#create combinations
for sentence in sentencelist:
    for word in wordlist:
        combo = str(sentence + ' ' + word)

        #loop through results file while no result for combination has bin found
        c_result = []
        while not c_result:
            for resultsfilename in os.listdir(resultsdirectory):
                with open(resultsfilename, 'r') as infile:
                    results = infile.read().splitlines()
                if combo in results:
                    c_result = function_to_find_pattern_based_on_continuation(continuation, results)

        #append results and reset c_result
        all_results.append(c_result)
        c_result = []


但是,该算法的运行时间很长,我想知道如何对其进行改进。例如,我想知道如何防止一遍又一遍地加载resultfile。此外,我想创建一个resultsfiles的副本,并且在从结果文件中读出句子+单词组合的结果后,可以将它们在副本中删除(我不想更改文件名上的文件驾驶)。但是,每个结果文件大约有7GB,因此将每个文件存储在变量中是没有意义的,对吧?

还有其他一些东西可以用来改善运行时间吗?

编辑1:调整列表的大小
Edit2:在代码中添加while循环和注释

最佳答案

据我了解,这里有两个问题。


您需要某种方法来减少多个大文件的I / O。
您需要一种方法来修改/复制其中一些大文件


我认为有几种方法可以解决这些问题。首先,如果可能的话,我将使用sqlite之类的数据库-这样可以消除您的大量文件打开/关闭问题。

其次,您可以在for循环中使用pythons yield运算符(将其放在自己的函数中),然后将其作为生成器进行迭代,并在运行时像流一样对其进行编辑。这样一来,您就可以存储结果(例如保存在文件中),而无需将所有结果都放在列表中,而列表会很快就耗尽内存。

关于python - 优化模式匹配的运行时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60335596/

10-13 09:35