Pickle Sympy lambda для многопоточности - PullRequest
0 голосов
/ 11 сентября 2018

Мне нужно оценить лямбда-функцию Sympy параллельно, используя multiprocessing.Pool.Кажется, что лямбда-функция Sympy не может быть выбрана по умолчанию и, следовательно, не работает при использовании в пуле.Есть ли какое-нибудь решение для этого?

Минимальный пример как ниже.

from multiprocessing import Pool
# from pathos.multiprocessing import Pool

x = sympy.symbols('x')
expr = sympy.sympify('x*x')
jacobian_lambda = sympy.lambdify(x, sympy.Matrix([expr]).jacobian([x]))

pool = Pool()

res1 = pool.apply_async(jacobian_lambda, [1])
res2 = pool.apply_async(jacobian_lambda, [2])

print([res1.get(), res2.get()])

Я ожидаю получить

[[2], [4]]

, который является производной отx ^ 2 на 1 и 2.

При попытке запустить приведенный выше код я получил следующую ошибку:

_pickle.PicklingError: Can't pickle <function <lambda> at 0x7efd90e32d08>: attribute lookup <lambda> on numpy failed

Мне известно, что Передача sympy lambda в многопроцессорную обработку.Pool.map может быть дублирующим вопросом, но, похоже, не существует решения без удаления лямбда-функции.

Передача sympy lambda в многопроцессорную обработку.Pool.map Принятый ответпредлагает определить функцию на верхнем уровне, которая, похоже, не решает проблему.Другое предложение использовать pathos.multiprocessing также не помогает в этом случае.

Спасибо.

...