化合物の一覧から、類似度検索や機械学習に使う特徴量を作る。chematic v1.1.4では、この前処理の計算を高速化し、フィンガープリントをNumPy配列として直接受け取れるようにしました。
公開Python版で測ると、同じ分子のTPSAを繰り返し読む速度はv1.1.3比で約9〜14倍でした。3化合物の実行例と、RDKit 2026.09.1も含めた同条件の測定を紹介します。
3化合物を、3行×2,048列の配列にする
ここでは、構造から計算する極性表面積の指標「TPSA」と、原子の周囲の構造をビット列で表す「Morganフィンガープリント」を使います。Morgan指紋による類似度比較や記述子の計算は、RDKitのPythonガイドでも紹介されている使い方です。
入力はエタノール、アスピリン、カフェインの3つです。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]
1行目はMorgan特徴量の配列が3行×2,048列で、各要素がuint8型であることを示します。要素は0か1です。2行目は、同じ順序に並んだ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)は、半径2・2,048ビットのMorgan指紋を返す、v1.1.4の新しいAPIです。np.stackで分子ごとの配列を縦に並べれば、類似度の計算や学習用データへ渡す行列になります。
ダウンロードしたスクリプトは、morgan.npyとtpsa.npyに配列を保存します。features.csvの出力例には、行番号、化合物ID、入力SMILES、TPSAを残しています。配列の行と元の化合物を結び付けたまま、次の処理へ進めます。
読み込みを含む処理を、公開パッケージで測る
SMILESから分子を作り、TPSAとMorgan指紋を両方計算する処理を測りました。公開コーパスの先頭1,000件をA、5,001〜6,000件をBとして、そのまま使っています。
以下はmacOS arm64・Python 3.13.6で測った1,000構造あたりの時間です。3つの公開パッケージを別々の環境に入れ、実行順を入れ替えながら21組測定しました。各組では5回の中央値を使い、表には21組の中央値を載せています。計測範囲はSMILESの読み込みから2種類の計算結果を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構造すべてで、3つのパッケージのTPSAとMorgan指紋が一致しました。Morganは全2,048ビットを照合しています。半径は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分子を読み込んで1回計算した後、分子ごとにTPSAを50回ずつ参照した測定です。読み込みと最初の計算は計測範囲の外に置いています。先ほどの表は読み込み込みの時間なので、それぞれの作業に対応する数値として読めます。
実装では、物性値のキャッシュを追加し、TPSAの計算から使っています。構造を編集した際には値を更新できるよう、原子・結合の編集後の回帰テストも用意しました。
指紋を返す処理では、詰めたビット列をバイト列へまとめて変換します。Pythonバインディングで1ビットずつ処理していた箇所を置き換え、そこからNumPyの0・1配列も作れるようにしています。
測定日は2026年10月14日です。測定スクリプト、全測定値、公開wheel・入力データ・実行例のハッシュを記録した実行記録を掲載しています。