我在尝试在Dask中实现循环时遇到了一些麻烦。 例如,在以下代码中:
for i in range(len(col)):
if df[col[i]].dtype=='object':
pass
elif df[col[i]].std().compute()==0:
cols_constant.append(col[i])
df = df.drop(cols_constant,axis=1)
相同的代码使用pandas非常快,但是在dask上花费了相当多的时间来完成任务。
我理解Dask对循环的效率低下。 但是如何为Dask优化我的代码以获得与上面类似的函数?
我不能使用e.persist(),因为我们打算在多个工作系统上进行计算。
使用函数' dask.do'是否有用?并行化同一个任务?
答案 0 :(得分:2)
每次拨打df.column.std.compute()
时,都会产生调用std()
的费用,但也会产生df
的费用。如果您从pandas数据框创建了df
,那么这很便宜,但如果您从一些更昂贵的流程创建df
,例如从CSV文件中读取,那么这可能会非常昂贵。
df = dd.from_pandas() # ok to call compute many times, data is already in memory
df = dd.read_csv(...) # slow to call compute many times, we read the all the csv files every time you call compute
如果你有记忆,那么你可以通过调用persist来避免这种重复的成本
df = df.persist()
在您的问题中,您说您不能使用persist,因为您计划在多工作系统上执行此操作。需要说明的是,如果你有可用的内存,那么persist在所有情况下都适用于单工和多工。
您也可以通过只调用一次来避免重复调用计算。
stds = [df[column].std() for column in df.columns]
stds = dask.compute(stds)
这会在一次通过中计算所有内容