(多少)在检查2个列表相对时首先通过第一次分类



我有一个我在大约50k的文件中寻找的800个元素的列表,每条长约50行。(这些是带有非类型名称的XML标签 - 搜索很简单,所以我不使用美丽的汤。)

每次找到一个元素的列表都会缩短。

通过文件迭代,

我首先要通过所有可能的元素来检查每一行(检查"斑点","漫游"," fido"等)或遍历所有线路检查一个元素的所有行时间(例如,检查文件中的所有行中的所有行以获取"斑点",然后检查所有行的" rover",等等...)?

还是这一切都效率低下?(这是使用Python。)我在想:

for line in somefile:
        for element in somelist:
              if re.search(element, line):
                  ....

或:

for element in somelist:
        for line in somefile:
              if re.search(element, line):
                  ....

通常,您将较大的数据集作为依次访问的数据集,并保留您感兴趣的值,内存或较大数据集的索引。所以是的,这确实很重要,在您的示例中,您想多次扫描文件,这是 lot 慢的。

让我们以一个例子说这些文件是50行,而您要寻找的800个"单词"。

for filename in filenames:
    for line in open(filename):
        if any(word in line for word in words):
            pass # do something

由于words是内存且易于扫描,它比打开每个文件800次要好得多 - 这是一个昂贵的操作。

所以,我想我应该用它来表达您应该尝试依次扫描"最昂贵"的数据集(这可能不是最长)。

描述算法的复杂性的big-o符号无论哪种方式都是相同的,但是如果您的一个迭代(例如,文件)都慢得多。访问且可能比其他访问大,您应该尽可能多地迭代它,即一次。

否则,该算法可能更容易以一种或另一种方式编写或理解。例如,如果您想要匹配任何正则列表中的所有字符串的列表,则首先在字符串列表上迭代并在每行上检查每条正则列表,在匹配时会脱离内部环。<<<<<<<<<<<<<<<<

实际上,当您以这种方式迭代时,整个任务可以是单线:

foundlines = [line for line in inputlines if any(r.search(line) for r in regexes)]

作为奖励,您将获得最快的迭代Python,可以使用列表理解/发电机表达式和any()

首先要在Regexes上进行迭代,最自然地列出匹配每个正则符合的行的列表,或者否则一条大列表(带有重复的线条),这些线与任何正则匹配的行(包括一个以上)。如果您想最终获得最多匹配的线条列表,那么您将需要以某种方式消除重复(在迭代期间或之后),这将影响算法的复杂性。结果也可能会以不同的顺序出现,这可能是一个问题。

简而

复杂性的顺序为 O(n*m),其中n和m可以表示列表和文件中的条目数,因此您先做哪种方式无关紧要。

最新更新