用于多线程的 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]])]
我需要使用 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
我知道
谢谢。
从多处理切换到 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]])]