内循环磁盘阵列和gi

2024-10-02 18:22:31 发布

您现在位置:Python中文网/ 问答频道 /正文

GIL锁会显著降低以下代码的性能吗?在

每个块上的函数使用python循环而不是numpy函数。由于有外部库,我不得不使用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调度程序进行其他操作。在

从wiki中,我看到了为compute而不是函数设置调度程序的方法:

^{pr2}$

Tags: 函数nameimportdefas调度blockchunks
1条回答
网友
1楼 · 发布于 2024-10-02 18:22:31

pythonfor循环不释放GIL,因此很难与线程并行。在这种情况下,你有几个选择

  1. 使用Numba或Cython这样的项目来编写释放GIL的for循环代码
  2. 使用一个调度程序将计算拆分为多个进程。我个人的建议是使用达斯克。分布式本地调度程序,这可以通过运行以下两行来完成:

    from dask.distributed import Client
    client = Client()
    

但是,您应该像往常一样分析代码并尝试一些事情。上面给出的建议取决于许多因素。例如,如果循环体释放GIL,Python For循环可能不是问题。在

相关问题 更多 >