У меня есть рекурсивная функция, которая делает что-то похожее на следующее:
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 для ускорения этого типа рекурсии.Хотя приведенный выше пример кода работает относительно быстро, реальный код медленнее (а), потому что он делает больше, чем простой расчет расстояния, включенный выше, и (б), потому что данные, с которыми он работает, больше похожи на размер (3000, 10, 3).), что даже для этого простого примера непомерно медленно, по крайней мере, на моей машине.
Одна мысль, которая у меня была, заключалась в том, чтобы использовать список / очередь для добавления рекурсивных заданий вместо прямого их вызова, а затемкаждый возврат из grow с использованием цикла prange для параллельной обработки заданий в списке / очереди, но, боюсь, это приведет к постоянному воссозданию потоков и снижению эффективности.