【问题标题】:Why does wrapping in `delayed` slow Dask down?为什么包裹在“延迟”中会减慢 Dask 的速度?
【发布时间】:2021-08-12 16:02:05
【问题描述】:

问题

我想获取数据框中的最小值并对其应用函数。

我也想偷懒。但是,这样做似乎会带来性能成本。

示例

我相信这个例子捕捉到了这种行为:

import dask
import dask.dataframe as dd

# Sample data
df = dask.datasets.timeseries(end='2002-01-31')

# Sample function
def f(x):
    return 2*x

task = df['id'].min()
f(task.compute())  # Takes ~1.6s on my machine
dask.delayed(f)(task).compute()  #  Takes ~3.5s on my machine

为什么第二次计算需要更长的时间?这可以通过某种方式改进吗?


补充说明

  • 查看仪表板,似乎使f 延迟会使数据的实际处理速度变慢。也就是说,较长的时间不是f通过delayed变慢引起的。
  • 如果您事先persist 数据帧,则两个任务的时间相等。
  • 使用read_parquet读取数据也会出现效果

Snakeviz

我尝试使用snakeviz 可视化任务。我只展示我认为重要的部分:

没有delayed

与delayed

【问题讨论】:

    标签: python pandas dataframe performance dask


    【解决方案1】:

    根据您输入数据的大小,在我看来这可能与hashing of the input to delayed function 有关。这是在实际计算之上的附加操作,如果您有大量输入数据,它可能会使其变慢。

    【讨论】:

    • 好主意,但我不相信这种情况:我将延迟任务传递给延迟函数,因此散列不应该花费任何时间。基础数据的大小无关紧要。还是我在这里遗漏了什么?
    • 我添加了一些 snakeviz 图表,希望能帮助深入了解问题的根源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2018-12-27
    相关资源
    最近更新 更多