Я понятия не имею, что должен делать алгоритм, поэтому я не буду его комментировать. Но вы заявляете, что:
После некоторых исследований я понимаю, что это должно быть O (n)!
Что представляет собой n
? Если временная сложность алгоритма линейна относительно количества строк в вашем наборе данных, то ваша реализация должна быть неправильной. В вашем коде есть два вложенных цикла, оба с длиной n
, что означает, что ваш алгоритм в лучшем случае находится в O(n^2)
(не считая того, что делают другие функции внутри l oop).
Вот несколько советов, как ускорить код до определенной степени (обычно при работе с pandas).
Вы должны избегать выполнения итераций самостоятельно и избегать превращения pandas структур данных в python списки. Вот пример:
for i in range(0, df.shape[0]):
l.append(df.iloc[i, 1])
Если вам действительно нужно сохранить это в другой переменной, тогда вы можете использовать
l = df.iloc[:, 1].copy()
Это будет быстрее и не превратит эту серию в список (но я не вижу, чтобы l
использовался где-либо в вашем коде, поэтому вам, вероятно, следует полностью его удалить).
Другой пример - когда вы вычисляете эти функции внутри вложенного l oop ( опять же, я не знаю, что они делают, но это на самом деле не имеет значения).
for i ...
for j ...
m1 = Chem.MolFromSmiles(df.iloc[i, 1])
fp1 = AllChem.GetMorganFingerprint(m1,2)
m2 = Chem.MolFromSmiles(df.iloc[j, 1])
fp2 = AllChem.GetMorganFingerprint(m2,2)
Во-первых, вы вычисляете одни и те же значения дважды, что может занять много времени, и вы делаете это в рамках своего custom l oop, что тоже не лучшая идея.
Вместо этих 4 строк (6, включая операторы l oop), вы можете создать новый столбец с fp
значениями:
df["fp"] = df.iloc[:, i].copy()
df["fp"].apply(lambda x: AllChem.GetMorganFingerprint(Chem.MolFromSmiles(x), 2))
Таким образом, вам не нужно вычислять значения дважды, и вам не нужно писать свой собственный l oop (по крайней мере, для этой части).
На этом этапе вам необходимо выяснить, как работает упомянутый алгоритм O(n)
, но я предполагаю, что он может быть преобразован в чисто векторные операции, что, вероятно, будет наиболее эффективной реализацией.