GILロックは次のコードのパフォーマンスを大幅に低下させますか?dask.arrayとgilロック内のループ
各ブロックの関数は、numpy関数の代わりにpythonループを使用します。私は外部ライブラリのためにPythonループを使用する必要があります。
テストコード:
import numpy as np
import dask.array as da
import dask.sharedict as sharedict
from itertools import product
def block_func(block):
for i in range(len(block)): # <--- the python loop ...
block[i] += 1
return block
def darr_func(x, name='test'):
dsk = {}
for idx in product(*map(range, x.numblocks)):
dsk[(name,) + idx] = (block_func, (x.name,) + idx)
dsk2 = sharedict.merge((name, dsk), x.dask)
return da.Array(dsk2, name, x.chunks, x.dtype)
def main():
n = 1000
chunks = 100
arr = np.arange(n*n).reshape(n, n)
darr = da.from_array(arr, chunks=chunks)
result = darr_func(darr)
print(result.compute())
main()
その場合は、スケジューラのヘルプのためのコンテキストを設定することができますか? dask配列を使って関数のコンテキストを設定する方法は?私は、dask配列よりも他の操作にデフォルトのdaskスケジューラーを使いたい。
ウィキから、私が代わりに機能のコンピューティングのためのスケジューラを設定する方法を参照してください。
# As a context manager
>>> with dask.set_options(get=dask.multiprocessing.get):
... x.sum().compute()
# Set globally
>>> dask.set_options(get=dask.multiprocessing.get)
>>> x.sum().compute()