У меня есть фрагмент кода ниже, где joblib.Parallel()
возвращает список.
import numpy as np
from joblib import Parallel, delayed
lst = [[0.0, 1, 2], [3, 4, 5], [6, 7, 8]]
arr = np.array(lst)
w, v = np.linalg.eigh(arr)
def proj_func(i):
return np.dot(v[:,i].reshape(-1, 1), v[:,i].reshape(1, -1))
proj = Parallel(n_jobs=-1)(delayed(proj_func)(i) for i in range(len(w)))
Вместо списка, как мне вернуть генератор, используя joblib.Parallel()
?
Редактировать:
Я обновил код, предложенный @ user3666197 в комментариях ниже.
import numpy as np
from joblib import Parallel, delayed
lst = [[0.0, 1, 2], [3, 4, 5], [6, 7, 8]]
arr = np.array(lst)
w, v = np.linalg.eigh(arr)
def proj_func(i):
yield np.dot(v[:,i].reshape(-1, 1), v[:,i].reshape(1, -1))
proj = Parallel(n_jobs=-1)(delayed(proj_func)(i) for i in range(len(w)))
Но я получаю эту ошибку:
TypeError: can't pickle generator objects
Я что-то упустил? Как я могу это исправить? Мое главное преимущество - уменьшить объем памяти, так как proj
может стать очень большим, поэтому я просто хотел бы вызывать каждый генератор в списке по одному.