如何使用Numba + Dask适当地并行化通用代码

时间:2020-02-11 01:39:31

标签: pandas numpy dask numba

我不熟悉使用DaskNumba来加速代码,我希望这对用户来说是一个有价值的问题,以获取有关如何并行化代码的最佳实践的答案。我已经制作了一个pandas数据框(具有3列)的通用测试用例。

将在框架中的3个向量上实现一个通用函数,以表示人们可能在数据分析中进行的转换的类型:将前两列加平方,然后取平方根,然后将布尔值与第3列进行比较,得出布尔值。

我实现了4个测试用例:(a)应用pandas,(b)Dask,(c)Numba,以及(d)Dask和{{ 1}}。

Numba的效果很好。我所有的问题都与Numba有关。这是我遇到的问题:

  1. Dask,无论我制作矢量的大小如何,速度都较慢。我可能不完全了解如何以及何时计算数据框的某些部分,或者如何使其正确并行化。它比常规申请要慢。
  2. 如何正确使用Dask进行并行化?我已经将其划分为4个分区,并且拥有2个核心处理器,但是您实际上如何决定如何格式化呢?
Dask

最后,还有一些其他最佳实践应该注意。想法是将其发送到具有许多节点的某种集群中。

时间是:

  • 普通大熊猫吃了150.6191689968109
  • 达克斯大熊猫153.70575094223022
  • Numba大熊猫拍了0.710655927658081
  • Numba Dask大熊猫获得了139.57402181625366

1 个答案:

答案 0 :(得分:2)

我认为dask太慢了,因为您正在使用以下方法计算序列:

ddf.map_partitions(
    lambda d: d.apply(lambda x: check_dist(x.col1,x.col2,x.col3), axis=1)
    ).compute()

,然后将其分配给新列,这种方式dask无法并行化进程。以下代码执行相同的操作,但运行时间为0.06秒:

#####################################
# Dask Assign
#####################################
t0 = time.time()
ddf = ddf.assign(col4=lambda x: check_dist(x.col1,x.col2,x.col3))
ddf.compute()
t1 = time.time()-t0
print("Dask using Assign took",t1)
ddf = ddf.drop('col4',axis=1)

我建议您查看一下dask文档中的“最佳做法”部分。

希望这会有所帮助!