Cython并行读取文件并绕过GIL

时间:2017-06-22 20:55:59

标签: python parallel-processing cython

试图弄清楚如何使用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个线程的更多加速​​

1 个答案:

答案 0 :(得分:1)

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

即。根据您的问题调整此问题:file_io.pyx我在此处发布,但无法弄清楚我的细胞是如何形成的。将nogil添加到cdef语句的末尾,然后在cpdef foo_parallel循环中的prange定义函数中调用该函数。使用read_file而不是慢速,并将其更改为cdef。请这样做后发表基准,因为我好奇并且没有电脑休假。