将化合物列表用于相似度搜索或机器学习,需要先把结构转换成数值特征。chematic v1.1.4 加速了这一步的计算,并支持直接接收 NumPy 格式的指纹数组。

在同一分子上重复读取 TPSA,公开版测量得到的速度约为 v1.1.3 的 9–14 倍。本文先用三个化合物演示,再比较 chematic 1.1.3、1.1.4 和 RDKit 2026.09.1 的公开 Python 包在相同输入上的表现。

将三个化合物转换成 3 × 2,048 矩阵

这里使用 TPSA,即根据结构计算的拓扑极性表面积,以及用比特表示原子局部环境的 Morgan 指纹。RDKit 的 Python 指南也介绍了描述符计算与基于 Morgan 指纹的相似度比较。

输入为乙醇、阿司匹林和咖啡因。在 Python 虚拟环境中,将 features.py 保存到空的工作文件夹,运行:

python -m pip install "chematic==1.1.4" "numpy==2.5.4"
python features.py
(3, 2048) uint8
[20.23 63.6  61.82]

第一行表示 Morgan 特征矩阵有三行、2,048 列,元素类型为 uint8,每个元素为 0 或 1。第二行是按相同化合物顺序排列的 TPSA,单位为 Ų。

生成数组的核心代码如下:

import chematic
import numpy as np

smiles = [
    "CCO",
    "CC(=O)Oc1ccccc1C(=O)O",
    "Cn1cnc2c1c(=O)n(C)c(=O)n2C",
]
molecules = [chematic.from_smiles(s) for s in smiles]
X = np.stack([mol.rdkit_ecfp_config_numpy(2, 2048) for mol in molecules])
tpsa = np.array([mol.rdkit_tpsa for mol in molecules])

rdkit_ecfp_config_numpy(2, 2048) 是 v1.1.4 新增的 API,返回半径为 2、长度为 2,048 比特的 Morgan 指纹。用 np.stack 按行组合各分子的数组,就可以得到供相似度计算或模型使用的矩阵。

下载的脚本将数组保存为 morgan.npy 和 tpsa.npy。features.csv 输出示例保留了行号、化合物 ID、输入 SMILES 和 TPSA。继续处理数据时,每行特征仍能对应到原始化合物。

对公开包计时,包含 SMILES 读取

我们测量从 SMILES 创建分子,再计算 TPSA 和 Morgan 指纹的完整调用。A 组取自公开语料的前 1,000 条记录,B 组为第 5,001–6,000 条,两组都未筛除记录。

下表是在 macOS arm64、Python 3.13.6 上处理 1,000 个结构的时间,单位为毫秒。三个公开包分别安装在独立环境中,轮换运行顺序,测量 21 组。每组取五次重复的中位数,表中再取 21 组的中位数。计时从 SMILES 读取开始,到两类计算结果返回 Python 为止,不包含 NumPy 转换或文件保存。

输入 v1.1.3 v1.1.4 RDKit 2026.09.1
A 13.21 ms 11.21 ms 95.10 ms
B 12.74 ms 11.20 ms 44.76 ms

相对于 v1.1.3,v1.1.4 的逐组配对速度比中位数为 A 组 1.18 倍、B 组 1.10 倍。配对自助法得到的 95% 区间分别为 1.13–1.20 倍和 1.08–1.14 倍。同一测量中,相对于 RDKit 的配对速度比分别为 A 组 8.51 倍、B 组 3.98 倍。

三个包在全部 2,000 个结构上的 TPSA 和 Morgan 指纹一致。指纹的全部 2,048 个比特都经过逐一比较。Morgan 半径为 2,关闭手性与计数模拟;TPSA 与 RDKit 默认设置相同,不计入 S、P 的贡献。

在同一分子上复用计算结果

读取后的分子可能依次用于筛选、特征准备和结果展示。v1.1.4 会把 TPSA 等已计算的值保存在分子上,供后续调用复用。

重复读取 TPSA 的速度,相对于 v1.1.3,在 A 组达到 8.99 倍,在 B 组达到 14.32 倍。95% 区间分别为 8.66–9.27 倍和 13.84–14.66 倍,两组输入的全部 21 组测量中,v1.1.4 都更快。

这项测量先读取各组 1,000 个分子,并对每个分子计算一次,再计时读取 TPSA,每个分子读取 50 次。读取分子和首次计算不在这项计时内。前面的表格则包含 SMILES 读取,两类数据分别对应工作流的不同阶段。

实现中新增了描述符数值缓存,由 TPSA 计算调用。原子和键编辑后的回归测试覆盖了结构改变后更新计算结果的行为。

指纹输出也改为整体转换打包的比特,替换了 Python 绑定中逐比特处理的循环,再从字节生成由 0 和 1 组成的 NumPy 数组。

测量日期为 2026 年 10 月 14 日。另提供测量脚本、全部计时数据,以及记录公开 wheel、输入数据与示例文件哈希的运行记录。