我有一个脚本,它获取查询 ID 的列表文件并从 uniprot 中提取有机体和序列,该代码运行良好,但速度非常慢。我想通过它处理大约 400 万个序列,但解析 100 个序列需要大约 5 分钟:
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 Prunus persica (Peach) (Amygdalus persica) MEENHAPALESIPNGDHEAATTTNDFNTHIHTNNDHGWQKVTAKRQRKTKPSKADSINNLNKLVPGVTIAGGEGVFRSLEKQSEDRRRRILEAQRAANADADSLAPVRSKLRSDDEDGEDSDDESVAQNVKAEEAKKSKPKKPKKPKVTVAEAAAKIDDANDLSAFLIDISASYESKEDIQLMRFADYFGRAFSAVTAAQFPWVKMFRESTVAKLADIPLSHISEAVYKTSVDWISQRSLEALGSFILWSLDSILADLASQVAGAKGSKKSVQNVSSKSQVAIFVVVAMVLRKKPDVLISILPTLRENSKYQGQDKLPVIVWAISQASQGDLAVGLHSWAHIVLPLVSGKGSNPQSRDLILQLAERILSTPKARTILVNGAVRKGERLVPPSAFEILIGVTFPAPSARVKATERFEAIYPTLKAVALAGSPRSKAMKQVSLQILSFAVKAAGESIPALSNEATGIFIWCLTQHADCFKQWDKVYQENLEASVAVLKKLSDQWKEHSAKLAPFDPMRETLKSFRHKNEKMLASGEDEAHQEKLIKDADKYCKTLLGKSSRGSGCKKSVALAVVALAVGAAVMSPNMESWDWDLEKLRVTISSFFD
任何人都可以建议我可以改进此代码以使其更快的一些方法吗?
提前致谢!
请您参考如下方法:
请求几乎总是所有网络代码中最慢的部分,因此您绝对希望对您的 ID 进行批处理。 Uniprot 有一个 batching capability in it's API .该页面上有一个 Perl 示例,应该可以帮助您入门——我会查看批大小限制是多少,然后以最大为起点(它可能比 4,000,000 小得多)。如 Uniprot 网站所述,还有一个 ID mapping service。这可能符合要求。
