我最近发现了dask模块,它旨在成为一个易于使用的python并行处理模块。对我来说最大的卖点是它和熊猫一起工作。
在阅读了它的手册之后,我找不到一种方法来完成这个简单的并行化任务:
ts.apply(func) # for pandas series
df.apply(func, axis = 1) # for pandas DF row apply
现在,为了在达斯克实现这一点,阿法克
ddf.assign(A=lambda df: df.apply(func, axis=1)).compute() # dask DataFrame
这是难看的语法,实际上比直接
df.apply(func, axis = 1) # for pandas DF row apply
有什么建议吗?
编辑:谢谢@MRocklin的地图功能。这似乎比普通大熊猫要慢。这与熊猫GIL释放问题有关还是我做错了?
import dask.dataframe as dd
s = pd.Series([10000]*120)
ds = dd.from_pandas(s, npartitions = 3)
def slow_func(k):
A = np.random.normal(size = k) # k = 10000
s = 0
for a in A:
if a > 0:
s += 1
else:
s -= 1
return s
s.apply(slow_func) # 0.43 sec
ds.map(slow_func).compute() # 2.04 sec
map_partitions
可以使用
map_partitions
函数将函数应用于数据帧的所有分区。请注意,func一次只能得到数据集的一部分,而不是像使用
pandas apply
那样的整个数据集(如果要进行并行处理,您可能不需要这样做)map
/apply
您可以使用
map
在序列中按行映射函数您可以使用
apply
跨数据帧逐行映射函数线程与进程
从0.6.0版起
dask.dataframes
与线程并行。自定义Python函数不会从基于线程的并行性中得到太多好处。你可以试试流程但要避免
apply
但是,您应该避免在Pandas和Dask中使用定制Python函数
apply
。这常常是表现不佳的一个原因。可能是,如果您找到了一种以矢量化方式执行操作的方法,那么您的Pandas代码可能会快100倍,而且您根本不需要dask.dataframe。考虑
numba
对于您的特定问题,您可以考虑^{} 。这将显著提高您的性能。
免责声明,我为一家同时生产
numba
和dask
的公司工作,并雇佣了许多pandas
开发人员。从v
dask.dataframe
开始。将委托责任应用于map_partitions
:相关问题 更多 >
编程相关推荐