我有一个脚本,它接受查询ID的列表文件并从uniprot中提取有机体和序列,代码运行良好,但速度非常慢。我希望通过它处理大约400万个序列,但需要大约5分钟来解析100个序列:
real 5m32.452s
user 0m0.651s
sys 0m0.135s
代码使用python的检索模块。我在网上看到我可以使用.session()属性,但是当我尝试这个时,我收到以下错误:
Traceback (most recent call last):
File "retrieve.py", line 14, in <module>
result = session.get(baseURL, payload)
TypeError: get() takes exactly 2 arguments (3 given)
此处列出了代码:
import requests
baseURL = 'http://www.uniprot.org/uniprot/'
sample = open('sample.txt','r')
out = open('out','w')
for line in sample:
query = line.strip()
payload = {
'query': query,
'format':'tab',
'columns': 'id, entry_name, organism, sequence'
}
result = requests.get(baseURL, payload)
if result.ok:
out.write(query + '\t' + result.text[41:] + '\n')
示例输入格式:
EDP09046
ONI31767
ENSFALT00000002630
EAS32469
ENSXETT00000048864
示例输出格式:
EDP09046 R6X9 A0A251R6X9_PRUPE桃(桃)(桃扁桃)MEENHAPALESIPNGDHEAATTTNDFNTHIHTNNDHGWQKVTAKRQRKTKPSKADSINNLNKLVPGVTIAGGEGVFRSLEKQSEDRRRRILEAQRAANADADSLAPVRSKLRSDDEDGEDSDDESVAQNVKAEEAKKSKPKKPKKPKVTVAEAAAKIDDANDLSAFLIDISASYESKEDIQLMRFADYFGRAFSAVTAAQFPWVKMFRESTVAKLADIPLSHISEAVYKTSVDWISQRSLEALGSFILWSLDSILADLASQVAGAKGSKKSVQNVSSKSQVAIFVVVAMVLRKKPDVLISILPTLRENSKYQGQDKLPVIVWAISQASQGDLAVGLHSWAHIVLPLVSGKGSNPQSRDLILQLAERILSTPKARTILVNGAVRKGERLVPPSAFEILIGVTFPAPSARVKATERFEAIYPTLKAVALAGSPRSKAMKQVSLQILSFAVKAAGESIPALSNEATGIFIWCLTQHADCFKQWDKVYQENLEASVAVLKKLSDQWKEHSAKLAPFDPMRETLKSFRHKNEKMLASGEDEAHQEKLIKDADKYCKTLLGKSSRGSGCKKSVALAVVALAVGAAVMSPNMESWDWDLEKLRVTISSFFD
有人可以提出一些方法,我可以改进这些代码,使其更快?
提前致谢!
答案 0 :(得分:5)
请求几乎总是任何网络代码中最慢的部分,因此您绝对想要批量ID。 Uniprot有一个batching capability in it's API。该页面上有一个Perl示例可以帮助您入门 - 我将查看批量大小限制是什么,并将最大值作为起点(它可能远小于4,000,000)。正如Uniprot网站上所指出的,还有ID mapping service可能适合该法案。