Я хочу использовать многопроцессорность в Python для ускорения цикла while.Параллелизация/многопроцессорность условного цикла
Подробнее:
У меня есть матрица (образцы * функции). Я хочу выбрать x подмножества образцов, значения которых при случайном подмножестве признаков не равны определенному значению (в данном случае -1).
Мой серийный код:
np.random.seed(43)
datafile = '...'
df = pd.read_csv(datafile, sep=" ", nrows = 89)
no_feat = 500
no_samp = 5
no_trees = 5
i=0
iter=0
samples = np.zeros((no_trees, no_samp))
features = np.zeros((no_trees, no_feat))
while i < no_trees:
rand_feat = np.random.choice(df.shape[1], no_feat, replace=False)
iter_order = np.random.choice(df.shape[0], df.shape[0], replace=False)
samp_idx = []
a=0
#--------------
#how to run in parallel?
for j in iter_order:
pot_samp = df.iloc[j, rand_feat]
if len(np.where(pot_samp==-1)[0]) == 0:
samp_idx.append(j)
if len(samp_idx) == no_samp:
print a
break
a+=1
#--------------
if len(samp_idx) == no_samp:
samples[i,:] = samp_idx
features[i, :] = rand_feat
i+=1
iter+=1
if iter>1000: #break if subsets cannot be found
break
Поиск для установки образцов является потенциально дорогостоящей частью (J цикла), который теоретически может работать параллельно. В некоторых случаях нет необходимости перебирать все образцы, чтобы найти достаточно большое подмножество, поэтому я выхожу из цикла, как только подмножество достаточно велико.
Я изо всех сил пытаюсь найти реализацию, которая позволила бы проверять, сколько уже сформированных действительных результатов. Возможно ли это?
Я использовал joblib
раньше. Если я правильно понимаю, это использует методы многопроцессорности pool
как бэкэнд, который работает только для отдельных задач? Я думаю, что queues
может оказаться полезным, но пока я не смог реализовать их.
Использование '' joblib' или multiprocessing.pool' имеет смысл. Я запускаю процесс на каждое ядро и создаю общий счетчик, защищенный «блокировкой» или реализованный как атомное целое число, увеличивая его до тех пор, пока он не достигнет определенного счета (с учетом дубликатов), а затем все процессы завершатся, возвращая их результаты. (Для этого вы, вероятно, можете использовать 'apply_async()'). – advance512
@ advance512 Спасибо, что предоставили мне эти методы для изучения. – Dahlai