我目前正在用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
这取决于您想做什么及其具体情况。 为了获得更快的结果,您可以将 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]