Я хотел бы распараллелить код, который вычисляет матрицу различий на основе отдельных последовательностей. Функция расстояния, которую я использую для вычисления расстояния между двумя людьми, основана на их longuest common substring
.
. У меня есть словарь с моими людьми в качестве ключей (цифры, от 1 до 30000 человек) и их последовательностями в качестве значений (списки)размером 8, с 4 модальностями: «Нет», «1», «2» и «> = 3»).
Я перебираю комбинации своих индивидуумов, и в каждой комбинации я вычисляю расстояниемежду двумя соответствующими последовательностями, а затем я обновляю матрицу различий с этим расстоянием.
import pandas as pd
import numpy as np
from itertools import combinations
import random
def lcsubstring_length(seq1, seq2):
table = {}
l = 0
for i, ca in enumerate(seq1, 1):
for j, cb in enumerate(seq2, 1):
if ca == cb:
table[i, j] = table.get((i - 1, j - 1), 0) + 1
if table[i, j] > l:
l = table[i, j]
return l
# distance function
def get_distance_sequences(seq1, seq2):
return (len(seq1) + len(seq2) - 2* lcsubstring_length(seq1, seq2))/(len(seq1) + len(seq2))
# Computation of dissimilarity matrix
def compute_dm_sequential(individuals_sequences):
n_individuals = len(individuals_sequences.keys())
dissimilarity_matrix = np.zeros((n_individuals, n_individuals ))
for pat1, pat2 in combinations(individuals_sequences.keys(), 2): # part to parallelize
print('Individual' + str(pat1) + ' vs Individual ' + str(pat2)) # just so we know where we are in the process
seq1 = individuals_sequences[pat1]
seq2 = individuals_sequences[pat2]
dissimilarity_matrix[pat1-1, pat2-1] = get_distance_sequences(seq1, seq2)
dissimilarity_matrix[pat2-1, pat1-1] = dissimilarity_matrix[pat1-1, pat2-1] # symmetric
return pd.DataFrame(dissimilarity_matrix)
# Here are my states :
states = ["None", "1", "2", ">= 3"]
# Little function that generates a random sequence of size 8 from states
def generate_sequence(states, seq_size):
sequence = []
for _ in range(seq_size):
sequence.append(random.choice(states))
return sequence
# Now I compute the dictionary with 30000 individuals (labelled 1 to 30000) :
individuals_sequences = {}
for i in range(1, 30001):
individuals_sequences[i] = generate_sequence(states, 8)
# Finally, computation of dissimilarity matrix :
# dm = compute_dm_sequential(individuals_sequences) # too long in sequential
Это представляет почти 500 000 000 сравнений (для 30000 человек) ...
Я бы хотелчтобы сделать что-то похожее на это: Юлия: эффективное распараллеливание вычисления матрицы различий , но это в Юлии. Ребята, вы знаете, как решить эту проблему с помощью Python? (multiprocessing
библиотека ..)
Большое спасибо:)