我不熟悉使用Dask
和Numba
来加速代码,我希望这对用户来说是一个有价值的问题,以获取有关如何并行化代码的最佳实践的答案。我已经制作了一个pandas
数据框(具有3列)的通用测试用例。
将在框架中的3个向量上实现一个通用函数,以表示人们可能在数据分析中进行的转换的类型:将前两列加平方,然后取平方根,然后将布尔值与第3列进行比较,得出布尔值。
我实现了4个测试用例:(a)应用pandas
,(b)Dask
,(c)Numba
,以及(d)Dask
和{{ 1}}。
Numba
的效果很好。我所有的问题都与Numba
有关。这是我遇到的问题:
Dask
,无论我制作矢量的大小如何,速度都较慢。我可能不完全了解如何以及何时计算数据框的某些部分,或者如何使其正确并行化。它比常规申请要慢。Dask
最后,还有一些其他最佳实践应该注意。想法是将其发送到具有许多节点的某种集群中。
时间是:
答案 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文档中的“最佳做法”部分。
希望这会有所帮助!