试图弄清楚如何使用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个线程的更多加速
答案 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
。请这样做后发表基准,因为我好奇并且没有电脑休假。