Я пытаюсь найти пары элементов, которые удовлетворяют определенному условию.Точнее, я хочу сформировать комбинацию из 2 (неупорядоченных) элементов среди 50 000 элементов так, чтобы соблюдалось определенное условие.
Мой набор данных содержит 50 000 элементов с уникальными идентификаторами и несколько наблюдаемых (местоположение и отсечка).Я хочу сформировать неупорядоченные пары из 2 элементов так, чтобы расстояние между двумя парными элементами было меньше заданного значения.
Пока мой сценарий следующий.
# Load the dataset (I have a custom function for it called loadFile)
df = loadFile(path_input,filename_input)
# Reset the index because I want to use the column "index" from 0 to 49,999
df = df.reset_index(drop=False)
# Initiate the list of pairs & get the number of elements
pairs = list()
nb_rows = df.shape[0]
# Loop over all the rows of my dataframe
for ind_x, x in df.iterrows():
# Just print to know where we stand from 1 to 50,000
print("{} out of {}".format(ind_x+1,nb_rows))
# Loop over all the rows of my dataframe
for ind_y, y in df.iterrows():
# We only consider the y-row if it was not covered yet by the previous pairs
# I also don't want to cover the case where both elements are equal
if ind_x<ind_y:
# Here is a custom condition (a simple function) returning a boolean
if distance(x["location"],y["location"])<x["cutoff"]:
pairs.append((x["id"],y["id"]))
Фактически,если мое пользовательское условие всегда соблюдается, мой сценарий может пройти через все 50 000 * 49 999/2 ~ 1 250 миллионов возможных пар ..
Для одного элемента "ind_x", текущий циклНа запуск скрипта уходит приблизительно 5 секунд, что составляет 50 000 * 5 / (60²) = 69 часов (много).
Есть ли способ ускорить мой скрипт, либо сам цикл, либоизменить мой подход, чтобы сэкономить время?
Заранее спасибо,
М