想象你是一家“分子料理餐厅”的后厨负责人。每天早上,平台都会送来成千上万张分子“菜谱”——它们有的写法千奇百怪,有的来自不同记录格式,有的还夹带着坏掉的数据。你需要三位各怀绝技的帮手:RDKit 是老牌主厨,精通从菜谱解读到指纹配制的全套手艺;OpenBabel 是翻译官,能在 120 多种格式之间自由切换;Datamol 是流水线工程师,专治“上万道重复菜品”的批量处理。这篇文章带你认识这支“分子厨房天团”:先给三位帮手画像(工具定位),再学会分子世界的基本语言(分子表示),然后逐个解锁主厨的厨艺(RDKit)、翻译官的绝活(OpenBabel)和流水线的效率(Datamol),最后交给你一份排班表(选型建议)和标准作业流程(工程实践),让你在药物发现与分子生成的数据处理中,不再对着报错日志挠头。

岗位关联

对 AI 从业者而言,分子数据处理是药物发现、分子生成模型落地前的第一道也是最重要的一道工序。掌握 RDKit、OpenBabel 与 Datamol 这套工具链,你能把“处理百万级分子”从苦力活变成标准流水线,为后续模型训练与虚拟筛选省下 80% 的时间。

目录
  1. 可视化演示
  2. 1. 三工具定位:三个岗位,各司其职
  3. 2. 分子表示基础:分子世界的通用语言
  4. 3. RDKit核心能力:主厨的十八般武艺
  5. 4. OpenBabel格式转换:翻译官的看家本领
  6. 5. Datamol流水线处理:现代化批量加工
  7. 6. 性能对比与选型:什么时候请谁出场
  8. 7. 工程落地实践:把流水线变成SOP
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示RDKit、OpenBabel、Datamol三大分子工具链的功能侧重、API风格与性能基准对比,交互切换查看工具差异。

本节配有交互动效(进入视口后自动加载,约 3KB)。

三大工具链功能侧重 RDKit功能最全指纹描述子反应化学全覆盖 OpenBabel擅长格式转换跨语言绑定灵活 coverage = features + formats + reactions RDKit适合研究OpenBabel适合转换Datamol适合高通量

1. 三工具定位:三个岗位,各司其职

一家后厨不会只有一位厨师。RDKit 是那位从 2006 年就开始掌勺的老牌主厨,背着一整套刀具,功能全面到近乎“分子全能工具箱”;OpenBabel 是穿梭于各实验室之间的翻译官,能和 120 多种“分子方言”打交道;Datamol 则是 2019 年后才加入的年轻流水线工程师,他不擅长复杂的分子太极拳,但最擅长把成千上万个分子排成队快速加工。记住这个分工:主厨管味道,翻译官管沟通,流水线管速度。

落到技术层面,RDKit 是一个以 C++ 为核心、提供 Python 封装的化学信息学库,BSD 协议允许商用。它的主场是分子读写、描述符(如分子量、logP)、指纹(如 Morgan/ECFP)、子结构搜索、构象生成与化学反应处理。OpenBabel 同样是 C++ 写成的老牌开源库(GPL),核心优势是 120+ 种化学文件格式互转,还内置了 MMFF94 等力场做构象优化。Datamol 则是纯 Python 实现的“RDKit 增强套件”(MIT 协议),目标是让 RDKit 用起来像 pandas 一样顺手。

三者并不是替代关系,而是互补关系。你可以用一个简单的心智模型来记:RDKit 是“引擎”,Datamol 是“驾驶舱”,OpenBabel 是“联运枢纽”。Datamol 底层调用 RDKit 的 C++ 加速核心,却把 RDKit 那套偏函数式的接口包装成了 DataFrame 风格——你直接对一列分子做 map、过滤、去重都行;OpenBabel 则处理 RDKit 不太擅长的“格式出入境”问题。理解了这层分工,后面每个章节你就知道该请谁出场了。

2. 分子表示基础:分子世界的通用语言

要指挥一支厨师团队,你得先看懂他们之间的“行话”。分子世界最常见的有三种语言:SMILES、SDF/MOL,以及程序内存里的“分子对象”。SMILES 是菜谱上的“简化符号”,SDF 是“食材档案卡”,分子对象才是出锅的成品菜。拿到任何分子数据,第一步永远是“把菜谱做成菜”。

SMILES 是一行 ASCII 字符。比如阿司匹林写成 CC(=O)Oc1ccccc1C(=O)O,其中 c1ccccc1 表示一个六元苯环,数字是环闭合的“接头暗号”。由于同一分子可以写出多种合法 SMILES,RDKit 提供了 canonical SMILES(规范写法)——把写法归一化,做去重时必须要用它。SDF(以及单分子的 MOL)则像一张食材档案卡,除了结构,还能记录 2D/3D 坐标和自定义属性字段,适合保存整个分子库集合。

这里藏着一个新手必踩的坑:SMILES 字符串本身不能直接计算。正则表达式、字符串切片对 SMILES 毫无化学意义;描述符、指纹、子结构搜索全都要求“成品菜”——即先解析成分子对象。RDKit 的 Chem.MolFromSmiles() 负责解析,失败时返回 None 而不是抛异常。所以拿到分子数据后的第一个动作,永远是解析并判空,把坏掉的“菜谱”挑出来扔掉。

3. RDKit核心能力:主厨的十八般武艺

主厨 RDKit 的功夫可以拆成四招:读菜谱(分子 IO)、称营养(描述符)、调秘方(指纹)、改菜品(分子编辑)。读菜谱是基本功:Chem.MolFromSmiles() 把 SMILES 变成 Mol 对象,Chem.MolFromMolFile() 读 MOL/SDF 文件,Chem.MolToSmiles(mol, canonical=True) 输出规范 SMILES,Chem.MolToMolBlock() 输出 MOL 文本。RDKit 对 SMILES/MOL/SDF 的支持极其扎实,但对 PDB 等生物大分子格式偏弱——这正是后面 OpenBabel 出场的地方。

描述符是一组数值化的“营养成分表”,最常用的是分子量(MW)和脂水分配系数(logP),以及氢键供体/受体数、TPSA(极性表面积)等。分子量的计算本质上就是一次加权求和:

指纹是 RDKit 最出彩的“秘方”。Morgan 指纹(也叫 ECFP)把每个原子周围的环境通过迭代哈希编码成固定长度的 0/1 向量——半径 2 就是“以每个原子为中心,向外看 2 层键”。分子越复杂,指纹向量就越是千变万化。拿两段指纹做相似度比较,最常用的指标是 Tanimoto 系数:

有了指纹加 Tanimoto,你就拥有了最常用的“找相似分子”工具。药物筛选里的经典邻居搜索(nearest neighbor search)就是基于这套组合:把分子变成向量,把向量变成相似度,把相似度变成排序。主厨的厨艺说到底,就是把化学问题翻译成数学问题。

MW=∑i=1nni×mi\displaystyle MW = \sum_{i=1}^{n} n_i \times m_i
Tanimoto 系数衡量两个分子指纹的“公共位”占比:分数越接近 1,说明共用特征越多,分子越相似。它是化学信息学相似性搜索的事实标准。
  1. 公共位计数$c = |A \cap B|$,数一数两个指纹向量里同为 1 的位数,这是“两个分子都有的特征”。
    c=∣A∩B∣c = |A \cap B|
  2. 并集位计数$|A \cup B| = a + b - c$,其中 $a$、$b$ 分别是 A、B 指纹中 1 的个数,并集等于两者之和减去重复计数的公共部分。
    ∣A∪B∣=a+b−c|A \cup B| = a + b - c
  3. 求比值用公共位数除以并集位数得到相似度,取值范围在 0 到 1 之间。
    SAB=ca+b−c\displaystyle S_{AB} = \frac{c}{a+b-c}

4. OpenBabel格式转换:翻译官的看家本领

主厨只会“中文菜谱”,但现实世界的菜谱可能来自蛋白数据库(PDB)、量子化学计算输出(Gaussian log)、ChemDraw 的 CDX……这时翻译官 OpenBabel 就登场了。他的核心本领是格式互转:支持 120 多种格式,包括 SMILES、SDF、MOL、PDB、InChI、XYZ、CIF、SMARTS 等,几乎覆盖了化学和生物医药领域的所有常见格式。

OpenBabel 有三套使用姿势。第一套是命令行工具 obabel:obabel input.pdb -O output.sdf 一行完成转换,加 --gen3d 参数还能从平面结构生成 3D 构象。第二套是底层的 openbabel 类库,适合深度定制。第三套是 Python 开发者最爱的 pybel 接口:pybel.readstring("smi", “……“) 读入,ob_mol.write(”mol”) 写出,ob_mol.make3D() 生成 3D 坐标。三套姿势对应三种场景:快速转格式、写复杂脚本、嵌入管道。

务必牢记一个警告:格式转换不是无损的。SDF 转 SMILES 会丢失坐标信息;SMILES 转 3D 是“重新建模构象”而不是“恢复原有坐标”;如果源格式携带手性特征而目标格式不支持,立体化学信息可能悄悄丢失。翻译官再厉害,也无法翻译出原语言里不存在的信息。正确的姿势是:先确认哪些信息不能丢(坐标、手性、电荷),选好目标格式,转换后用原子数和手性中心数做一次质量抽检。

5. Datamol流水线处理:现代化批量加工

主厨做一道菜很快,但一天要处理一万道菜,就该让流水线工程师 Datamol 上场了。它的第一个杀手锏是 DataFrame 集成:分子可以直接存进 pandas 表格,df[“mol“] 一列全是分子对象,可以和数值列放在一起操作;dm.to_df(SMILES列表) 能直接生成带 smiles 列的表格。这样你就把”分子处理“和”数据分析”彻底打通了。

第二个杀手锏是惰性求值:dm.lazy 创建的容器不会立刻计算,只在真正用到的时刻才执行。这特别适合探索性分析——先过滤、再算描述符、最后才落地,避免中间结果撑爆内存。第三个杀手锏是并行化:dm.parallelized(func, inputs, n_jobs=-1) 自动把任务分发到多个 CPU 核,还自带进度条。Datamol 还内置了分子清洗三件套:dm.standardize(标准化电荷与芳香性)、按 canonical SMILES 去重、按 SMARTS 或属性过滤(如去掉 PAINS 泛干扰物)。

并行加速不是无限倍的,背后有一条阿姆达尔定律:

所以,Datamol 的并行化用来处理“每个分子独立计算”的任务最合适,比如批量算分子量、算指纹、做标准化。而那些有前后依赖的串行任务(比如逐步缩并的聚类过程),交给并行也快不起来。实践上,十万条以上的分子库推荐这样排产:Datamol 读入 → 并行清洗 → RDKit 精算 → DataFrame 导出。

S=1(1−P)+PN\displaystyle S = \frac{1}{(1-P) + \frac{P}{N}}
阿姆达尔定律告诉我们:并行加速的上限由程序中无法并行的串行部分决定。如果 80% 的任务能并行,哪怕 CPU 核数趋近无限,理论加速上限也只有 5 倍。
  1. 串行占比$(1-P)$ 是程序中无法并行的部分,它的耗时不会因增加 CPU 而减少。
    1−P1-P
  2. 并行均摊$\frac{P}{N}$ 表示可并行部分被 $N$ 个处理器同时分担后的耗时,$N$ 越大这部分越小。
    PN\frac{P}{N}
  3. 取倒数得加速比加速比等于原耗时除以新耗时,也就是串行与并行两部分之和的倒数。
    S=1(1−P)+PN\displaystyle S = \frac{1}{(1-P) + \frac{P}{N}}

6. 性能对比与选型:什么时候请谁出场

后厨排班讲究性价比。同样是切菜,切一盘让主厨来,切一万盘必须上流水线。选型的关键不在于“哪个工具最强”,而在于“当前瓶颈在哪里”。从性能特征看,RDKit 是 C++ 内核,单分子计算描述符、指纹的开销极低;但如果你用 Python for 循环逐个处理百万分子,Python 解释器本身会成为瓶颈——这正是 Datamol 的 dm.parallelized 要解决的问题。

API 风格差异也很明显。RDKit 偏“函数式工具箱”,要记的模块名极多(Chem、Descriptors、Fingerprints、Lipinski……),功能全但学习曲线陡;OpenBabel 提供命令行、底层类、pybel 三套界面,各取所需;Datamol 走 pandas 风格,方法链加 DataFrame,代码最简洁,上手最快。三者各有一个“最能打”的场景,可以用一张表总结:

| 典型场景 | 首选工具 | 理由 |

|---------|---------|------|

| 单分子描述符与指纹 | RDKit | 功能最全最稳 |

| 大批量清洗与并行处理 | Datamol | DataFrame + 并行加速 |

| 多格式互转与 3D 生成 | OpenBabel | 格式支持最广 |

| 分子相似性搜索 | RDKit | Morgan + Tanimoto 组合 |

| PDB 等蛋白文件处理 | OpenBabel | 兼容生物大分子格式 |

一句话:没有最强的工具,只有最合适的岗位。主厨不会去刷一万个盘子(那是流水线的活),翻译官也不会下场炒菜。让对的人做对的事,整条流水线才能又快又稳。

7. 工程落地实践:把流水线变成SOP

再好的团队也需要标准作业流程,否则新人一接手就乱成一锅粥。先看环境配置,用 conda 最省心:conda create -n chem python=3.11 创建环境后,执行 conda install -c conda-forge rdkit openbabel datamol,三件套一次性装好,版本冲突最少。如果只需要 RDKit,pip install rdkit 也够用。

然后是五个最佳实践。第一,任何 SMILES 解析后立刻判空(mol is None 就过滤掉)。第二,去重之前先把所有分子转成 canonical SMILES,避免同一结构因写法不同被重复计数。第三,大批量任务先抽样 1000 条跑通流程,再全量执行——先炒一锅试味道,再上大锅。第四,超大数据用 Datamol 惰性求值加分批写出,避免内存被打满。第五,格式转换前后对比原子数与手性中心数,做质量抽检。

最后是三个常见陷阱:一是在 for 循环里逐条调用 RDKit,百万分子能跑几个小时——必须改用向量化或并行;二是忽略 RDKit 打印的警告信息,很多警告其实在暗示“分子被修正过”,比如芳香性被重新判断;三是把结构相同但 SMILES 写法不同的分子当成不同分子,导致重复计数。把这套 SOP 固化到脚本里,你就拥有一家“永不翻车”的分子厨房:原料进来,经过解析、清洗、并行计算、格式转换,最终变成干净、标准、可直接喂给 AI 模型的结构化数据。

AI 应用场景

场景1:百万级化合物库的清洗与特征工程

阶段:数据准备与特征工程

解决的问题:在药物虚拟筛选中,从 ZINC、ChEMBL 等公开数据库下载的 SMILES 格式混乱,含有无效字符串、重复结构和缺失字段。传统做法是用 Python 循环逐个解析计算,百万级数据要跑数小时且容易中途崩溃。用 RDKit 校验分子合法性、OpenBabel 统一文件格式、Datamol 并行计算描述符,可以把处理时间压缩到几十分钟。

具体案例:某团队从 ChEMBL 抽取 320 万条活性数据,先用 Chem.MolFromSmiles 过滤无效条目,再用 Datamol 的 dm.parallelized 并行计算分子量、logP 和 ECFP 指纹,同时按 Tanimoto 相似度对近似分子聚簇去冗,最后用 OpenBabel 把筛选后的子集导出为标准 SDF 文件供后续分子对接使用。

场景2:分子生成模型输出的后处理管线

阶段:模型推理后处理

解决的问题:用深度学习模型(VAE、扩散模型、图神经网络)生成候选分子时,输出中常有大量非法 SMILES、重复结构和错误的立体化学表达。模型“编”出的分子五花八门,需要快速校验、去重、排序,才能进入下一步打分与对接。

具体案例:一个分子生成模型一次采样 5 万条 SMILES,管线先用 RDKit 批量解析并过滤非法项,再对合法分子计算 Morgan 指纹,按 Tanimoto ≥ 0.85 的阈值去重(相似度过高视为冗余),Datamol 用 dm.parallelized 并行完成全部 5 万条计算,最后用 OpenBabel 的 make3D 生成 3D 构象输入对接软件。整条管线 20 分钟跑完,产出 800 多个多样性合格的候选分子。

Python 演示

python33 行
import datamol as dmfrom rdkit import Chemfrom rdkit.Chem import Descriptorsfrom openbabel import pybel SMILES = [    "c1ccccc1C(=O)O",         # 苯甲酸    "CC(=O)Oc1ccccc1C(=O)O",  # 阿司匹林    "CCO",                     # 乙醇]  def safe_mw(mol):    if mol is None:        return None    return round(Descriptors.MolWt(mol), 2)  def main():    df = dm.to_df(SMILES)    mols = df["smiles"].map(dm.to_mol)    df["MW"] = dm.parallelized(safe_mw, list(mols), n_jobs=2)    print(df[["smiles", "MW"]])     ob_mol = pybel.readstring("smi", SMILES[1])    ob_mol.make3D()    block = ob_mol.write("mol")    line_count = len(block.strip().splitlines())    print("OpenBabel 3D MOL 块行数:", line_count)  if __name__ == "__main__":    main()
目的:演示 RDKit、OpenBabel、Datamol 三件套协同工作的最小闭环——RDKit 解析分子并计算描述符,Datamol 完成表格化与并行批量计算,OpenBabel 生成 3D 构象。
  1. df = dm.to_df(SMILES)用 Datamol 把 SMILES 列表直接变成 pandas DataFrame,分子数据从此进入“表格世界”。
  2. mols = df["smiles"].map(dm.to_mol)对每一行 SMILES 调用 RDKit 解析成分子对象,一行代码取代手写 for 循环。
  3. df["MW"] = dm.parallelized(safe_mw, list(mols), n_jobs=2)并行计算分子量,任务自动分配到两个 CPU,返回结果直接写回 DataFrame 新列。
  4. if mol is None: return None解析失败时 RDKit 返回 None,这里做安全兜底,保证并行任务不因坏数据崩溃。
  5. ob_mol = pybel.readstring("smi", SMILES[1])用 OpenBabel 的 pybel 接口读入阿司匹林 SMILES,这是“翻译官”的入场动作。
  6. ob_mol.make3D()调用 OpenBabel 的看家本领:从平面结构生成 3D 坐标,供后续分子对接或构象分析使用。

常见误区

误区反正都是处理分子的库,RDKit 更出名、功能更全,那我只学 RDKit 就够了,OpenBabel 没有必要学。

正解两者的核心定位完全不同。RDKit 擅长分子结构计算——描述符、指纹、子结构搜索;而 OpenBabel 的护城河是 120+ 种格式互转和命令行生态。就像主厨再厉害也做不到翻译所有菜谱语言。真实管线里,常常是先用 OpenBabel 统一输入格式,再用 RDKit 计算性质,各管一段。

为何常见:对初学者而言,两个库都能读写 SMILES/SDF,功能表面上高度重叠,很难看到“格式互转”这类场景下 OpenBabel 的不可替代性。

误区拿到 SMILES 后不解析,直接丢给 Descriptors.MolWt 或者用字符串方法数原子,结果报错或者算出荒谬的数。

正解SMILES 只是“菜谱文字”,必须先解析成分子对象(RDKit 的 Mol 或 OpenBabel 的 OBMol)才能计算。Chem.MolFromSmiles 解析失败返回 None,所以每次解析后都要判空。Datamol 的 dm.to_mol 就是把“解析 + 判空”包装好的便捷函数。

为何常见:很多教程导出的数据长成“一行一个 SMILES”的样子,看起来可以直接喂给函数,容易忽略中间的解析层。

误区Datamol 更现代、写起来更简洁,那以后只用 Datamol 就好了,RDKit 可以丢掉。

正解Datamol 是 RDKit 的“增强外壳”,底层仍然调用 RDKit 的 C++ 核心。它提供 DataFrame 集成、惰性求值、并行化这些便利,但高级能力如化学反应 SMARTS、药效团分析、复杂构象采样仍需直接使用 RDKit。两者是“驾驶舱”与“引擎”的关系,不是替代关系。

为何常见:Datamol 的 API 太顺手,容易让初学者误以为它是独立于 RDKit 的另一个库,而忽略了源码里大量 from rdkit import 的事实。

误区反正都是表示同一个分子,SDF 转 SMILES、SMILES 转 3D SDF 都应该是无损的,转了就能直接用。

正解格式转换有信息边界。2D SDF 转 SMILES 会丢失坐标;SMILES 转 3D 是“重新生成”构象而不是“保留”原坐标;含手性中心或双键顺反异构的分子,如果目标格式不支持精确表达,立体化学信息会悄悄丢失。重要数据转换前后必须做原子数、手性中心的对比校验。

为何常见:转换后分子画出来看起来一样,程序也不报错,只有仔细对比(原子数、手性、构象 RMSD)时才会发现差异——这类“静默错误”最迷惑人。

面试题

Q1. RDKit 中把 SMILES 字符串解析成分子对象的函数是哪个?

单选题 · easy

  • A.Chem.MolToSmiles(mol)
  • B.Chem.MolFromSmiles(smi)← 正确答案
  • C.Chem.SmilesToMol(smi)
  • D.Chem.ParseSmiles(smi)

答案:B。MolFromSmiles 是 RDKit 官方解析入口,把字符串变成 Mol 对象。MolToSmiles 是反方向(分子→字符串);RDKit 中并不存在 SmilesToMol 或 ParseSmiles 这两个 API。记住"From"表示从文本到对象的方向即可。

Q2. OpenBabel 相较于 RDKit 最突出的核心能力是什么?

单选题 · easy

  • A.海量分子格式互转← 正确答案
  • B.深度神经网络训练
  • C.量子化学能量计算
  • D.可视化图表绘制

答案:A。OpenBabel 以 120+ 种格式转换和命令行工具闻名,是分子世界当之无愧的“翻译官”。神经网络训练、量子化学计算、可视化绘制都不是它的主场,那些分别是深度学习框架、量化软件和可视化库的职责。

Q3. 阿司匹林的 SMILES 是 CC(=O)Oc1ccccc1C(=O)O,其中包含几个环?

单选题 · easy

  • A.0 个环
  • B.1 个环← 正确答案
  • C.2 个环
  • D.3 个环

答案:B。c1ccccc1 表示一个六元苯环,数字 1 是环闭合标记,成对的相同数字代表一个环的起点与终点。阿司匹林分子只有一个苯环,因此答案为 1 个环。数环是读懂 SMILES 的基本功。

Q4. 用 Chem.MolFromSmiles 解析非法 SMILES 字符串时,返回值是什么?

单选题 · mid

  • A.空字符串
  • B.整数 0
  • C.None← 正确答案
  • D.抛出异常

答案:C。RDKit 解析失败时返回 None 并打印一条错误日志,而不是抛出异常。因此新手最常见的 bug 是“忘记判空,把 None 当分子对象继续计算”。这是 RDKit 的一个经典陷阱,也解释了为什么所有教程都强调解析后立即判空。

Q5. Datamol 与 RDKit 之间的本质关系是什么?

单选题 · mid

  • A.完全替代 RDKit
  • B.封装并增强 RDKit← 正确答案
  • C.与 RDKit 完全无关
  • D.仅用于数据可视化

答案:B。Datamol 构建在 RDKit 之上,把 RDKit 的能力包装成 pandas 风格接口,并额外提供并行化、惰性求值等增强功能。它离不开 RDKit 的 C++ 核心,是“驾驶舱”与“引擎”的关系,而不是替代或平行关系。

Q6. 衡量两个分子指纹(如 Morgan 指纹)相似度最常用的指标是?

单选题 · mid

  • A.Tanimoto 系数← 正确答案
  • B.均方误差
  • C.交叉熵损失
  • D.准确率

答案:A。Tanimoto 系数计算“公共位数 / 并集位数”,是化学信息学相似性搜索的事实标准。均方误差、交叉熵、准确率都是机器学习指标,衡量的是模型预测与标签的差异,与分子指纹的相似性度量不是一回事。

Q7. 以下哪些属于化学信息学中的常见分子表示格式?

多选题 · mid

  • A.SMILES 线性表示← 正确答案
  • B.SDF 结构文件← 正确答案
  • C.MOL 分子文件← 正确答案
  • D.JPEG 图片文件

答案:ABC。SMILES 是线性文本编码,SDF 和 MOL 是携带坐标与属性的结构文件,三者都包含可被程序计算的分子拓扑信息。JPEG 是位图图片,只有像素没有化学结构,机器无法从中计算分子量或指纹。

Q8. Datamol 中用于并行化批量计算的函数是哪个?

单选题 · hard

  • A.dm.parallelized(func)← 正确答案
  • B.dm.multiprocess(func)
  • C.dm.batch_apply(func)
  • D.dm.thread_pool(func)

答案:A。dm.parallelized(func, inputs, n_jobs) 是 Datamol 官方提供的并行接口,支持进度条、自动任务分片和结果收集。其余三个 API 在 Datamol 中并不存在。多选题里记住"parallelized"这个词,拼写也很关键。

Q9. 关于分子指纹(Morgan/ECFP)的说法,正确的有哪些?

多选题 · hard

  • A.把分子编码为固定长度二进制向量← 正确答案
  • B.通过原子环境半径迭代生成← 正确答案
  • C.常用于相似性搜索与机器学习建模← 正确答案
  • D.就是 SMILES 字符串

答案:ABC。Morgan 指纹基于“每个原子周围环境”的迭代哈希生成,输出固定长度的 0/1 位向量,是分子性质预测和相似度检索的常见特征表示。SMILES 是文本字符串,不是指纹向量,两者是完全不同的表示层次。

Q10. 关于分子格式转换中的信息丢失,下列说法正确的有哪些?

多选题 · extreme

  • A.SDF转SMILES丢失3D坐标信息← 正确答案
  • B.SMILES转SDF保留原始坐标信息
  • C.手性中心转换可能丢失构型信息← 正确答案
  • D.任何格式转换都不会丢失信息

答案:AC。SDF 存储坐标而 SMILES 只存拓扑与手性标记,因此 A 对。SMILES 本身没有坐标,转成 SDF 只会重新计算 2D 坐标而非保留原坐标,B 错。当目标格式不支持手性表达时,构型信息可能静默丢失,C 对。格式之间表达力不同,转换总存在信息边界,D 错。