使用 pubchempy 将 CID 转换为 Chembl_id

问题描述 投票:0回答:1

我目前正在用Python开发一个项目,一个相当长的步骤是将CID(化合物识别号)列表转换为Chembl_id。为此,我使用 pubchempy lib

from pubchempy import Compound
chembl_values=[]
for cid in cids:
    c = Compound.from_cid(cid)
    find=c.synonyms
    chembl_values.append(next((value for value in find if value.startswith('CHEMBL')), None))
chembl_values = [value for value in chembl_values if value is not None]

(最后一步是删除没有 Chembl_id 的 CID)

通过此代码,我获得各种数据,然后“浏览”它并仅保留 chembl_id 我也尝试使用 Request 执行此操作,但我无法仅获取 Chembl_id。

我想尝试在时间方面优化代码,因为现在只有 170 cid,平均需要 3 分钟。

您对如何优化代码以使整个过程更快有什么想法吗?也许以不同的方式使用 pubchem 库或以不同的方式使用 Request

python bioinformatics pubchem
1个回答
0
投票

这取决于您想做什么及其具体情况。 为了获得更快的结果,您可以将 for 循环转换为列表理解。

from pubchempy import Compound
chembl_values = [
    value
    for cid in cids
    for value in Compound.from_cid(cid).synonyms
    if value.startswith('CHEMBL')
]

其他解决方案可能是实现异步函数。

import aiohttp
import asyncio
from pubchempy import Compound

async def fetch_synonyms(session, cid):
    try:
        c = await asyncio.to_thread(Compound.from_cid, cid)  # Fetch compound data asynchronously
        synonyms = c.synonyms
        # Return the first CHEMBL synonym, or None if not found
        return next((value for value in synonyms if value.startswith('CHEMBL')), None)
    except Exception as e:
        print(f"Error fetching CID {cid}: {e}")
        return None

async def process_cids(cids):
    async with aiohttp.ClientSession() as session:
        # Fetch synonyms for all CIDs asynchronously
        tasks = [fetch_synonyms(session, cid) for cid in cids]
        chembl_values = await asyncio.gather(*tasks)

    return [value for value in chembl_values if value is not None]
© www.soinside.com 2019 - 2024. All rights reserved.