如何使用 dask 实现无返回值的函数? (图像处理)

问题描述 投票:0回答:2

我有一个功能

crop_images_circle(file_dir,kmeans_dir,folders_dir,filename)
。不会返回任何东西。 尝试使用 dask 并行化计算。

对大约 100 个奇怪的文件进行无 dask 的实现:

for filename in os.listdir(file_dir):
    crop_images_circle(file_dir,kmeans_dir,folders_dir,filename)

执行时间(以秒为单位):53.58223843574524

用 dask 实现:

# Version 1
for filename in os.listdir(file_dir):
    x = delayed(crop_images_circle)(file_dir,kmeans_dir,folders_dir,filename)
    x.compute()

执行时间(以秒为单位):46.36917209625244

# Version 2
for filename in os.listdir(file_dir):
    x = delayed(crop_images_circle)(file_dir,kmeans_dir,folders_dir,filename)

x.compute()

dask 的版本 2 仅处理一张图像。不知道为什么。文档确实提到了类似的用途, 所需的时间并没有那么显着的不同。使用 dask 有改进吗?或者我搞乱了语法?

python image-processing dask-delayed
2个回答
0
投票
这来自 dask 最佳实践。可以回答上面的问题

不要依赖副作用

延迟函数仅在计算时才执行某些操作。你会 总是需要将输出传递给最终调用的东西 计算。

enter image description here


0
投票

版本 1 未成功并行化,因为调用

.compute()
时延迟函数立即执行。版本 2 删除除最后一个对象之外的所有延迟对象,因此仅处理最后一个图像。你需要收集所有延迟的对象并调用一次
compute()

all_x = []
for filename in os.listdir(file_dir):
    x = delayed(crop_images_circle)(file_dir,kmeans_dir,folders_dir,filename)
    all_x.append(x)
dask.compute(all_x)
© www.soinside.com 2019 - 2024. All rights reserved.