亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在python中更快地進行搜索?

如何在python中更快地進行搜索?

慕田峪7331174 2021-03-18 18:08:36
我正在從一個文件的另一行搜索值。確切的值將僅在搜索文件中出現一次。我怎樣才能使這個過程更快?這是我當前的代碼:filltaxlist = open("file with query number.txt", "rw")fulltaxa = open("output file with hit line match", "rw")for line in filltaxalist:    line = line.strip()    taxid = re.split("\t", line)    lookup = taxid[5] # this value is a number and I need the exact match only so I convert it to an integer    int1 = int(lookup)    for line in open("File to search.txt", "r"):        data = re.split(',', line)        hit = int(data[0]) # every value in this file is a number separated by a ,        if lookup in line:            if int1 == hit:                fulltaxa.write(line)這寫得很好,因為它寫得很慢。另外,我正在搜索的文件大小超過GB。這filltaxlist行示例:cvvel_1234    403454663    29.43    3e-30    55.55555555234    1172189cvell_1444    2342333      30.00    1e-50    34.34584359345    5911cvell_1444    234230055    23.23    1e-60    32.23445983454    46245cvell_1444    233493003    23.44    1e-43    35.23595604593    46245fulltaxa應該返回什么:1172189, 5943, 1002030, 123455911, 11234, 112356, 234, 3456, 44568, 7835646245, 123, 3432456, 123488976, 23564, 33446245, 123, 3432456, 123488976, 23564, 334
查看完整描述

2 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

使用數據庫

正如其他人提到的那樣,最簡單的方法可能是將其轉儲到數據庫(例如sqllite)中。如果需要與該語言進行交互,則可以使用python綁定。


純Python解決方案

您fulltaxa完全閱讀了每個條目filltaxlist(由于嵌套的順序),這將更有效地先緩存所有查詢,然后fulltaxa只讀取一次,然后對輸出進行排序以重新獲得的順序fulltaxa。


由于查詢的順序是導入的,因此我們應該使用FIFO結構-在我們的情況下,雙端隊列會做得很好。


from collections import defaultdict

filltaxlist = open("file with query number.txt", "rw")

fulltaxa = open("output file with hit line match", "rw")


possibles = {}

for i, line in enumerate(filltaxalist):

    line = line.strip()

    taxid = re.split("\t", line)

    lookup = taxid[5] # this value is a number and I need the exact match only so I covert it to an integer

    int1 = int(lookup)

    possibles[int1] = i


output_lines = defaultdict(list)

for line in open("File to search.txt", "r"):

    data = re.split(',', line)

    hit = int(data[0]) # every value in this file is a number separated by a ,

    if hit in possibles:

        output_lines[possibles[hit]].append(line)


fulltaxa.writelines(line for lines in output_lines.values() for line in lines)

當您用完查詢時,上面的代碼將引發IndexError


其他一些小的改進。


data = re.split(',', line)

可能比


data = line.split(',')

但您應該進行剖析,以確保這對您而言是個危險。


查看完整回答
反對 回復 2021-03-31
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

您的算法為O(m * n)??梢酝ㄟ^使用字典來制定O(m + n)算法。即使m很小,也可能是Python的一項重大改進,其中字典訪問的常量因素與任何其他語句并沒有太大區別。


filltaxalist = open("file with query number.txt", "rw")

fulltaxa = open("output file with hit line match", "rw")


filltaxadict = {}

for i, line in enumerate(filltaxalist):

    line = line.strip()

    taxid = re.split("\t", line)

    lookup = taxid[5] # this value is a number and I need the exact match only so I convert it to an integer

    int1 = int(lookup)


    filltaxadict[int1] = i


results = [[]] * len(filltaxadict)

for line in open("File to search.txt", "r"):

    data = re.split(',', line)

    hit = int(data[0]) # every value in this file is a number separated by a ,

    match = filltaxadict.get(hit)

    if match is not None:

        results[match].append(line)


for result in results:

    fulltaxa.writelines(result)

這將以正確的順序處理重復項;如果您不需要,則稍微簡單一些。要搜索的文件可能很大;這不會將其內容保留在內存中,而只是(部分)filltaxalist的內容保留在內存中,我認為這并不是異常大。


查看完整回答
反對 回復 2021-03-31
  • 2 回答
  • 0 關注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號