簡體   English   中英

相互檢查2個列表時,首先排序的數量(多少)有關系嗎?

[英](How much) does it matter which is sorted through first when checking 2 lists against each other?

我在大約50k個文件(每個大約50行長)中有800個元素的清單。 (這些是具有非通用名稱的xml標記-搜索很簡單,因此我不使用Beautiful湯。)

每次找到一個元素,就會縮短800個元素的列表。

遍歷文件,

請問我先檢查所有可能的元素(檢查“ spot”,“ rover”,“ fido”等的行),還是一次檢查所有一個元素(例如,檢查文件中所有行的“位置”,然后檢查所有行的“流動站”,等等...)?

還是所有這些都效率低下? (這是使用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):
                  ....

通常,您將較大的數據集保留為順序訪問的數據集,並將您感興趣的值保留在內存中或作為較大數據集的索引。 所以,是的,這非常重要,而在你的榜樣,你正在尋找多次掃描的文件,這是慢了很多

讓我們以一個示例為例,這些文件中的每個文件都是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)]

另外,您將使用列表推導/生成器表達式以及any()獲得Python能夠實現的最快迭代。

首先遍歷正則表達式,最自然的是制作一個與每個正則表達式匹配的行列表,或者一個與任何正則表達式匹配(包括多個)的行的大列表(重復)。 如果您想得到最多與一個正則表達式匹配的行列表,那么您將需要以某種方式消除重復(在迭代過程中或之后),這會影響算法的復雜性。 結果也可能會以不同的順序出現,這可能是一個問題。

簡而言之,當迭代器的性能等效時,選擇最適合您要解決的問題的方法。

復雜度的順序為O(n*m) ,其中n和m可以代表列表和文件中的條目數,因此無論您采用哪種方式都無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM