python – Cython并行读取文件并绕过GIL

试图弄清楚如何使用Cython绕过GIL并为IO绑定任务并行加载文件.现在我有以下Cython代码试图加载文件n0.npy,n1.py … n100.npy

def foo_parallel():
    cdef int i

    for i in prange(100, nogil=True, num_threads=8):
        with gil:
            np.load('n'+str(i)+'.npy')

    return []

def foo_serial():
    cdef int i

    for i in range(100):
        np.load('n'+str(i)+'.npy')

    return []

我没有注意到显着的加速 – 有没有人有这方面的经验?

编辑:我平均每小时900毫秒,连续1.3秒.预计8线程会有更多加速

最佳答案 正如评论所述,你不能将NumPy与gil一起使用并期望它变得平行.您需要C或C级文件操作才能执行此操作.请参阅此处的帖子,了解潜在的解决方案
http://www.code-corner.de/?p=183

即适应你的问题:file_io.pyx我会在这里发布,但无法弄清楚我的细胞是怎么回事.将nogil添加到那里的cdef语句的末尾,并从prange循环中的cpdef foo_parallel定义函数调用该函数.使用read_file而不是慢速文件并将其更改为cdef.请这样做之后发布基准测试,因为我很好奇,并且在度假时没有电脑.

点赞