Pickle Sympy lambda用于多线程

问题描述 投票:1回答:1

我需要使用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的另一个建议也无济于事。

谢谢。

python numpy lambda sympy scientific-computing
1个回答
0
投票

似乎从多处理切换到运行不正常(很像链接的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]])]
© www.soinside.com 2019 - 2024. All rights reserved.