我有一个递归函数,其功能类似于以下内容:
import numpy as np
from copy import copy
shared_data = np.random.randn(6, 5, 3)
def grow(current_data, level):
grown_data = []
if level < shared_data.shape[0] - 1:
nlevel = level + 1
valid = ((shared_data[nlevel] - current_data[-1])**2).sum(axis=-1) < 1
for new_data in shared_data[nlevel, valid]:
continue_data = copy(current_data)
continue_data.append(new_data)
grown_data.extend(grow(continue_data, level+1))
else:
grown_data.append(current_data)
return grown_data
begin_data = np.random.randn(3)
print(grow([begin_data], 0))
我想知道是否有某种方法可以在cython中启动一个新的并行线程,以便对grow函数的每个条目进行当前处理,以加快这种类型的递归速度。尽管上面的示例代码运行相对较快,但实际代码速度较慢(a)因为它比上面包括的简单距离计算要多,并且(b)因为它正在处理的数据更像大小(3000、10、3 ),即使对于这个简单的示例,它的速度也非常慢,至少在我的机器上是如此。
曾经有人以为我要使用列表/队列来添加递归作业,而不是直接调用它们,然后在每次增长时,使用prange循环并行处理列表/队列中的作业,但是恐怕这会导致线程一直在重新生成并降低效率。