试图弄清楚如何使用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.请这样做之后发布基准测试,因为我很好奇,并且在度假时没有电脑.