我想并行执行一个sympy lambda函数。
我不知道:
lambdify
的第一个返回值,为什么会起作用显然, Markdown 预处理器在代码上方需要一行文本,因此这是代码:
from multiprocessing import Pool
import sympy
from sympy.abc import x
def f(m):
return m.lambdify()(1)
class Mult():
def lambdify(self):
# return sympy.lambdify(x, 2*x, 'numpy')
self._lambdify = sympy.lambdify(x, 2 * x, 'numpy')
return self._lambdify
if __name__ == '__main__':
with Pool() as pool:
m = Mult()
print(pool.map(f, [m]))
print(pool.map(f, [m]))
print(f(m))
print(pool.map(f, [m]))
它打印:
[2]
[2]
2
PicklingError: Can't pickle <function <lambda> at 0x000000000DF0D048>: attribute lookup <lambda> on numpy failed
(我削减了追溯)
如果我不加评论,它可以正常工作:
[2]
[2]
2
[2]
我仅在Windows上进行了测试,它与“numexpr”而不是“numpy”的工作原理完全相同。
最佳答案
创建对象Mult
时没有任何字段。因此,可以使用库存的pickle
库对其进行腌制。然后,当您调用lambdify
时,您将_lambdify
属性添加到包含lambda
表达式的对象,该表达式不能被腌制。这会导致map
函数失败
这解释了为什么在调用lambdify
之前可以腌制对象并使用Pool.map
以及为什么调用后它失败的原因。
在lambdify
中取消注释该行时,不会将属性添加到类中,并且在调用Mult
之后仍然可以腌制lambdify
对象。
关于python - 将sympy lambda传递给multiprocessing.Pool.map,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45085095/