将 tqdm 与延迟执行与 python 中的 dask 相结合
combining tqdm with delayed execution with dask in python
tqdm
和 dask
都是 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
基于:
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 输出截图:
tqdm
和 dask
都是 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
基于:
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 输出截图: