Я вычисляю пространственный KDE с помощью scipy.stats.kde.gussian kde. Однако его оценка занимает довольно много времени - 70% времени моего скрипта, что составляет 26 с для 10000 строк. Я бы хотел сделать это быстрее. Вот мой исходный код:Многопроцессорная пространственная оценка плотности ядра в python
from scipy.stats import kde
kernel = kd.gausian_kde(values, bw_method=.05)
result = kernel(positions)
Основываясь на Speed up sampling of kernel estimate, я реализовал многопроцессорная:
SKERNEL = None
# sets global kernel function
# - multiprocessing requires my function to be top-level module function
setKernel()
def calc_kernel(sample):
return SKERNEL(sample)
def genKernel(elements):
cores = mp.cp_count()
torun = np.array_split(elements, cores, axis=1)
pool = mp.Pool(processes = cores)
r = pool.map(calc_kernel, torun)
return np.concatenate(r)
Однако на том же наборе данных эта реализация занимает 36 секунд для запуска. с помощью cProfiler, я вижу, что большую часть времени занимает «ожидание». Что я делаю неправильно и как это можно изменить, чтобы работать быстрее?
спасибо. Я думал то же самое: тогда, я думаю, мне нужно производить гораздо больше и куски, чтобы распределение работы было более сбалансированным –
, что могло бы помочь, но если режим вашего дистрибутива - довольно небольшой кластер, вы все равно можете не повезло; вычислительные требования масштабируются квадратично в плотности точек. возможно, рандомизация вашего раскола тоже может помочь, так что режим не заканчивается в одном куске по конструкции –
, к сожалению, он все еще делает все медленнее, а не быстрее - не уверен, почему это –