Как ускорить этот python l oop скрипт или распараллелить его - PullRequest
1 голос
/ 19 марта 2020

В настоящее время я работаю над сценарием, который принимает данные для матрицы корреляции и вычисляет набор значений. этот шаг очень дорог, и я хотел бы найти способы ускорить или распараллелить его. Я пытался использовать Parallel (из python 'joblib), однако из-за перегрузки процессора (по крайней мере, из-за способа, которым я его параметризовал), он значительно медленнее, чем последовательная l oop.

import time
import numpy as np
import itertools
from sklearn.datasets import make_blobs


N = 5000
data,_ = make_blobs(n_samples=N,n_features=500)
G =  np.corrcoef(data)


''' the cluster function '''
def clus_lc(i, j, G, ns=2):
    ''' c_s'''
    cs = 2*(G[i,j]+1)-1e-6
    ''' A and B'''
    if cs<=ns:
        return 0
    return 0.5*( np.log(ns/cs) +  (ns - 1)*np.log( (ns**2 - ns) / ( ns**2 - cs) )  )

''' merge and time '''


indices = list(itertools.combinations(range(N),2))
t0 = time.time()
costs = np.zeros(len(indices))
k=0
for i, j in indices:
    costs[k] = clus_lc(i,j,G)
    k+=1
t1 = time.time()
toseq = t1-t0
print(toseq)

1 Ответ

0 голосов
/ 19 марта 2020

Я думаю, что решил проблему, используя numba и добавив декоратор @jit. Кажется, это работает нормально, потому что все операции в функции - это вызовы numpy функций. В наборе данных с N = 5000 он идет от 75 сек c до 10 сек c. Fantasti c улучшение. Теперь, можно ли это еще улучшить, мне интересно услышать другие материалы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...