关于 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。
2 条评论