【发布时间】:2016-06-21 13:38:00
【问题描述】:
我想在 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。如果我理解正确,这将使用pool 多处理方法作为仅适用于单独任务的后端?我认为queues 可能会有所帮助,但到目前为止我未能实现它们。
【问题讨论】:
-
使用
joblib或multiprocessing.pool是有意义的。我会为每个核心运行一个进程,并创建一个共享计数器,由Lock保护或实现为原子整数,将其递增直到达到特定计数(考虑到重复),然后所有进程都会完成,返回他们的结果。 (您可能可以使用apply_async())。 -
@advance512 感谢您提供这些方法供我研究。
标签: python parallel-processing python-multiprocessing