[英](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.