加快python的请求功能

时间:2018-02-19 19:18:01

标签: python performance python-requests bioinformatics

我有一个脚本,它接受查询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

有人可以提出一些方法,我可以改进这些代码,使其更快?

提前致谢!

1 个答案:

答案 0 :(得分:5)

请求几乎总是任何网络代码中最慢的部分,因此您绝对想要批量ID。 Uniprot有一个batching capability in it's API。该页面上有一个Perl示例可以帮助您入门 - 我将查看批量大小限制是什么,并将最大值作为起点(它可能远小于4,000,000)。正如Uniprot网站上所指出的,还有ID mapping service可能适合该法案。