这个想成为生物信息学家的人需要你的帮助。下面的代码使用 rdkit 查找化合物规范微笑的相似性。经过一番研究,我明白它必须是 O(n)!(或者不是?)因为对于一个包含 944 个条目的小文件,它需要 20 分钟,而对于最大的一个,即 330.000 个条目,它已经运行了 30 多个小时。现在,我现在知道它的一个问题是它不会只比较元素一次,所以这是减慢它的一个因素。我在这里读到,您可以使用 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')