このバイオインフォマティシャン志望者はあなたの助けを必要としています。以下のコードは、rdkit を使用して、複合語の正規スマイルの類似性を検出します。いくつかの調査の後、O(n) でなければならないことがわかりました。944 エントリの小さなファイルでは 20 分かかりましたが、330.000 エントリの最大ファイルでは 30 時間以上実行されていたためです。さて、問題の 1 つは要素を 1 回だけ比較しないことであり、それが速度を低下させる 1 つの要因であることがわかりました。itertools ライブラリを使用して比較を高速化できることをここで読みましたが、一般的に、このコードをどのように改善すればよいのでしょうか? 私が学ぼうとしている間、何か助けていただければ幸いです:)
from rdkit import Chem
from rdkit import DataStructs
from rdkit.Chem import AllChem
import pandas as pd
l =[]
s1 = []
s2 = []
d1 = []
d2 = []
with open('input_file.csv', 'r') as f:
df = pd.read_csv(f, delimiter = ',', lineterminator = '\n', header = 0)
for i in range(0, df.shape[0]):
l.append(df.iloc[i, 1])
for i in range(0, df.shape[0]):
for j in range(0, df.shape[0]):
m1 = Chem.MolFromSmiles(df.iloc[i, 1])
fp1 = AllChem.GetMorganFingerprint(m1,2)
m2 = Chem.MolFromSmiles(df.iloc[j, 1])
fp2 = AllChem.GetMorganFingerprint(m2,2)
sim = DataStructs.DiceSimilarity(fp1,fp2)
if sim >= 0.99:
s1.append(i)
s2.append(j)
for k in range(0, len(s1)):
if df.iloc[s1[k], 0] != df.iloc[s2[k], 0]:
d1.append(df.iloc[s1[k], 0])
d2.append(df.iloc[s2[k], 0])
if len(d1) != 0:
with open('outputfile.tsv', 'a') as f2:
for o in range(0, len(d1)):
f2.write(str(d1[o]) + '\t' + str(d2[0]) + '\n')