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(',')
但您應該進行剖析,以確保這對您而言是個危險。
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的內容保留在內存中,我認為這并不是異常大。
添加回答
舉報
