我正在尝试使用Joblib来并行化代码中的一些计算。以下是我目前掌握的情况:
data = {'tag': [], 'radials': []}
def append_radials(*args):
for tag in range(len(sacla_tags)):
det_data = get_detdata_for_single_tag(sacla_tags[tag], beamline, run)
radial_profile = np.array(profiler.get_mean_profile(det_data))
data['radials'].append(radial_profile)
data['tag'].append(sacla_tags[tag])
args = [sacla_tags, beamline, run, profiler]
Parallel(n_jobs=5, verbose=50)(delayed(append_radials)(*args) for i in range(5))
简而言之,append_radials
函数收集一些数据,将其放入radial_profile
行,然后将输出附加到data
字典。这是在一个非常大的数据集上迭代,大约需要15分钟才能完成。我想使用joblib来加快速度
按照编写代码的方式,它循环遍历每个作业中的每个标记(len(sacla_tags)=5000
)。相反,我希望它将标记分成5个不同的作业(每个作业1000个标记),然后将输出附加到全局字典data
这可能吗?我做错了什么
编辑:
下面是我的代码的一个简单示例
def f(i):
dat = []
q = i**2 * np.sqrt(i**(3/2))
dat.append(q)
return dat
x = np.linspace(1,10000000,1000000)
p = Parallel(n_jobs=5, verbose=50)(delayed(f)(x) for j in range(5))
这里p
的输出是:
In [37]: p
Out[37]:
[[array([1.00000000e+00, 7.30854392e+02, 4.32617501e+03, ...,
1.77826963e+19, 1.77827452e+19, 1.77827941e+19])],
[array([1.00000000e+00, 7.30854392e+02, 4.32617501e+03, ...,
1.77826963e+19, 1.77827452e+19, 1.77827941e+19])],
[array([1.00000000e+00, 7.30854392e+02, 4.32617501e+03, ...,
1.77826963e+19, 1.77827452e+19, 1.77827941e+19])],
[array([1.00000000e+00, 7.30854392e+02, 4.32617501e+03, ...,
1.77826963e+19, 1.77827452e+19, 1.77827941e+19])],
[array([1.00000000e+00, 7.30854392e+02, 4.32617501e+03, ...,
1.77826963e+19, 1.77827452e+19, 1.77827941e+19])]]
p
中的每个数组都是相同的长度,joblib没有分割范围。相反,它运行了五次
我知道这是一些基本的概念,我不太了解joblib是如何工作的,但是我应该如何告诉它,例如,将x
分成5个块,并并行运行它们
目前没有回答
相关问题 更多 >
编程相关推荐