使用 Dask 在 Python 中进行并行计算

Dask 库将 Python 计算扩展到多个核心甚至多台机器。
138 位读者喜欢这篇文章。
Pair programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

关于 Python 性能的一个常见抱怨是 全局解释器锁 (GIL)。由于 GIL 的存在,一次只能有一个线程执行 Python 字节码。因此,即使在现代多核机器上,使用线程也不会加速计算。

但是,当您需要并行化到多个核心时,您不必停止使用 Python:Dask 库会将计算扩展到多个核心甚至多台机器。一些设置在数千台机器上配置 Dask,每台机器都有多个核心;虽然存在扩展限制,但它们不容易达到。

虽然 Dask 有许多内置的数组操作,但作为一个非内置的例子,我们可以计算偏度

import numpy
import dask
from dask import array as darray

arr = dask.from_array(numpy.array(my_data), chunks=(1000,))
mean = darray.mean()
stddev = darray.std(arr)
unnormalized_moment = darry.mean(arr * arr * arr)
## See formula in wikipedia:
skewness = ((unnormalized_moment - (3 * mean * stddev ** 2) - mean ** 3) /
            stddev ** 3)

请注意,每个操作都将使用尽可能多的核心。这将跨所有核心并行化,即使在跨数十亿元素进行计算时也是如此。

当然,并非总是如此,我们的操作可以由库并行化;有时我们需要自己实现并行性。

为此,Dask 具有“延迟”功能

import dask

def is_palindrome(s):
    return s == s[::-1]

palindromes = [dask.delayed(is_palindrome)(s) for s in string_list]
total = dask.delayed(sum)(palindromes)
result = total.compute()

这将并行计算字符串是否为回文,并将返回回文字符串的计数。

虽然 Dask 是为数据科学家创建的,但它绝不仅限于数据科学。无论何时我们需要在 Python 中并行化任务,我们都可以求助于 Dask——无论是否有 GIL。

标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,帮助举办 Linux “安装聚会”。他自 1999 年以来一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 在那些术语存在之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可重现性以及其他此类事情。

2 条评论

不错的文章,Moshe!

一个错字?
unnormalized_moment = darry.mean(arr * arr * arr)
应该是
unnormalized_moment = darray.mean(arr * arr * arr)

不错的文章,感谢您介绍 Dask。

对于在 Python 中使用 dask 与 multiprocessing 或 concurrent.futures 库进行并行计算,您有什么看法?

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.