达克斯比香草蟒蛇最低?我在做什么错?

时间:2019-12-13 15:05:46

标签: python-3.x dask dask-delayed

我正在测试dask,但我不明白dask如何比普通的python慢​​。我使用jupyer开发了两个示例,每个示例都有时间,而且我认为自己做错了

第一次使用dask:28.5秒,之后使用纯Python 140 ms

    import dask
    import dask.array as da
    %%time
    def inc(x):
        return x + 1

    def double(x):
        return x + 2

    def add(x, y):
        return x + y

    N = 100000

    data = [0 for x in range(N)]
    x = da.from_array(data, chunks=(1000))

    output = []
    for x in data:
        a = dask.delayed(inc)(x)
        b = dask.delayed(double)(x)
        c = dask.delayed(add)(a, b)
        output.append(c)

    total = dask.delayed(sum)(output)
    total.compute()
**28.8 seconds**

现在有了普通的python

    %%time
    def inc(x):
        return x + 1

    def double(x):
        return x + 2

    def add(x, y):
        return x + y

    N = 100000

    data = [0 for x in range(N)]

    output = []
    for x in data:
        a = inc(x)
        b = double(x)
        c = add(a, b)
        output.append(c)

    total = sum(output)
**140 milliseconds**

1 个答案:

答案 0 :(得分:0)

您的代码在我的计算机上运行:38s。 这段代码:

x = da.from_array(data, chunks=(1000))
%time ((x + 1) + (2*x)).compute()

在24毫秒内运行。

x = np.array(data)
%time ((x + 1) + (2*x))

以350us运行。

点:

  • 您的数据是否容易放入内存(numpy或pandas),您可能无法从dask中获得任何信息,因为这些库已经非常快了
  • Dask有集合API,例如数组,请使用它们
  • 不要for-遍历数组!
  • 如果单个函数的运行时间<< 1ms,那么dask只会增加开销;这肯定是你的情况。您会在本教程中注意到,这些函数包括sleep来模拟CPU工作,从而使您实际上获得了一些并行性
  • 不要多次调用.compute(),请尝试将您要执行的操作形成为一次调用以进行计算,该调用需要任意数量的参数。