使用Dask在Python中進(jìn)行并行計(jì)算
Dask 庫(kù)可以將 Python 計(jì)算擴(kuò)展到多個(gè)核心甚至是多臺(tái)機(jī)器。
關(guān)于 Python 性能的一個(gè)常見抱怨是全局解釋器鎖(GIL)。由于 GIL,同一時(shí)刻只能有一個(gè)線程執(zhí)行 Python 字節(jié)碼。因此,即使在現(xiàn)代的多核機(jī)器上,使用線程也不會(huì)加速計(jì)算。
但當(dāng)你需要并行化到多核時(shí),你不需要放棄使用 Python:Dask 庫(kù)可以將計(jì)算擴(kuò)展到多個(gè)內(nèi)核甚至多個(gè)機(jī)器。某些設(shè)置可以在數(shù)千臺(tái)機(jī)器上配置 Dask,每臺(tái)機(jī)器都有多個(gè)內(nèi)核。雖然存在擴(kuò)展規(guī)模的限制,但一般達(dá)不到。
雖然 Dask 有許多內(nèi)置的數(shù)組操作,但舉一個(gè)非內(nèi)置的例子,我們可以計(jì)算偏度:
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)
請(qǐng)注意,每個(gè)操作將根據(jù)需要使用盡可能多的內(nèi)核。這將在所有核心上并行化執(zhí)行,即使在計(jì)算數(shù)十億個(gè)元素時(shí)也是如此。
當(dāng)然,并不是我們所有的操作都可由這個(gè)庫(kù)并行化,有時(shí)我們需要自己實(shí)現(xiàn)并行性。
為此,Dask 有一個(gè)“延遲”功能:
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()
這將計(jì)算字符串是否是回文并返回文的數(shù)量。
雖然 Dask 是為數(shù)據(jù)科學(xué)家創(chuàng)建的,但它絕不僅限于數(shù)據(jù)科學(xué)。每當(dāng)我們需要在 Python 中并行化任務(wù)時(shí),我們可以使用 Dask —— 無論有沒有 GIL。