使用Cython创建没有prange的并行线程

时间:2019-02-27 15:55:14

标签: python recursion parallel-processing cython

我有一个递归函数,其功能类似于以下内容:

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循环并行处理列表/队列中的作业,但是恐怕这会导致线程一直在重新生成并降低效率。

0 个答案:

没有答案