2016-06-05 3 views
1

Я вычисляю пространственный 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, я вижу, что большую часть времени занимает «ожидание». Что я делаю неправильно и как это можно изменить, чтобы работать быстрее?

ответ

1

Стоимость оценки ядра в каждой позиции зависит от плотности массива значений вблизи этой позиции. То есть разделение точек, которые должны быть разбиты на массивы одинакового размера, не приведет к равному времени оценки для этих подзадач; что будет очень актуально для каждой проблемы типа KDE, с которой я когда-либо работал.

+0

спасибо. Я думал то же самое: тогда, я думаю, мне нужно производить гораздо больше и куски, чтобы распределение работы было более сбалансированным –

+0

, что могло бы помочь, но если режим вашего дистрибутива - довольно небольшой кластер, вы все равно можете не повезло; вычислительные требования масштабируются квадратично в плотности точек. возможно, рандомизация вашего раскола тоже может помочь, так что режим не заканчивается в одном куске по конструкции –

+0

, к сожалению, он все еще делает все медленнее, а не быстрее - не уверен, почему это –