用于多线程的 Pickle Sympy lambda

Pickle Sympy lambda for multithreading

我需要使用 multiprocessing.Pool 并行评估 Sympy lambda 函数。似乎 Sympy lambda 函数在默认情况下无法被 pickle,因此在 Pool 中使用时会失败。有什么解决办法吗?

一个最小的例子如下。

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

我知道 可能是一个重复的问题,但似乎没有不删除 lambda 函数的解决方案。

接受的答案建议在顶层定义一个函数,这似乎并不能解决问题。另一个使用 pathos.multiprocessing 的建议在这种情况下也无济于事。

谢谢。

从多处理切换到 loky 似乎可以解决这个问题(很像链接的 ):

from loky import get_reusable_executor
import sympy

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

executor = get_reusable_executor()

list(executor.map(jacobian_lambda, [1,2]))

Out[1]: [array([[2]]), array([[4]])]