我需要使用multiprocessing.Pool并行评估Sympy lambda函数。似乎Sympy lambda函数默认情况下无法被腌制,因此在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
我知道Passing sympy lambda to multiprocessing.Pool.map可能是一个重复的问题,但是如果不删除lambda函数,似乎没有解决方案。
Passing sympy lambda to multiprocessing.Pool.map可接受的答案建议在顶层定义一个函数,但这似乎无法解决问题。在这种情况下,使用pathos.multiprocessing的另一个建议也无济于事。
谢谢。
似乎从多处理切换到运行不正常(很像链接的question中的技巧:]]
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]])]