将 tqdm 与延迟执行与 python 中的 dask 相结合

combining tqdm with delayed execution with dask in python

tqdmdask 都是 python 中迭代的惊人包。 tqdm 实现了所需的进度条,dask 实现了多线程平台,它们都可以使迭代过程不那么令人沮丧。然而 - 我无法将它们组合在一起。

例如,下面的代码实现了dask延迟执行,进度条为tqdm.trange。问题在于,由于 delayed 执行得很快,进度条会立即结束,而真正的计算时间工作是在 compute 部分完成的。

from dask import delayed,compute
from tqdm import trange
from time import sleep

ct = time()
result= []

def fun(x):
    sleep(x)
    return x

for i in trange(10):
    result.append(delayed(fun)(i))

print compute(result)

如何将进度条附加到 compute 命令中的实际执行?

考虑 Dask 的进度条

from dask.diagnostics import ProgressBar

with ProgressBar():
    compute(result)

构建您自己的诊断

您可以使用此插件架构在每个任务结束时获取信号。 http://dask.pydata.org/en/latest/diagnostics.html

下面是一个人这样做的例子:https://github.com/tqdm/tqdm/issues/278

基于:

Dask Integration

from tqdm.dask import TqdmCallback

with TqdmCallback(desc="compute"):
    ...
    arr.compute()

# or use callback globally
cb = TqdmCallback(desc="global")
cb.register()
arr.compute()

应用于问题中的代码:

from dask import delayed,compute
from tqdm.auto import tqdm
# from tqdm import trange
from time import sleep

from tqdm.dask import TqdmCallback

# ct = time()
result= []

def fun(x):
    sleep(x)
    return x

for i in tqdm(range(10)):
    result.append(delayed(fun)(i))

with TqdmCallback(desc="compute"):
    print(compute(result))

jupyter 输出截图: