我想在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 for循環),這在理論上可以並行運行。在某些情況下,不需要遍歷所有樣本以找到足夠大的子集,這就是爲什麼一旦子集足夠大,我就會跳出循環。
我很努力地找到一個實現,可以檢查已經生成了多少有效結果。它甚至有可能嗎?
我以前用過joblib
。如果我理解正確,這會使用多處理方法作爲僅適用於單獨任務的後端?我在想,queues
可能會有所幫助,但迄今爲止我未能實施它們。
使用'joblib'或'multiprocessing.pool'是有道理的。我會爲每個核心運行一個進程,並創建一個共享計數器,由'Lock'保護或者實現爲一個原子整數,將其遞增直至達到特定計數(考慮到重複),然後所有進程都將完成,返回他們的結果。 (你可以使用'apply_async()')。 – advance512
@ advance512謝謝你給我這些方法來看看。 – Dahlai