将sympy lambda传递给multiprocessing.Pool.map

Lab*_*abo 5 python sympy multiprocessing

我想并行执行一个sympy lambda函数.我不知道:

  • 为什么它并行工作,虽然它是一个lambda函数
  • 当我尝试在没有池的情况下执行时它停止工作的原因
  • 如果我取消注释第一次返回,它为什么会起作用 lambdify

显然降价预处理器需要在代码上方的一行文本,所以这是代码:

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]))
Run Code Online (Sandbox Code Playgroud)

它打印:

[2]
[2]
2
PicklingError: Can't pickle <function <lambda> at 0x000000000DF0D048>: attribute lookup <lambda> on numpy failed
Run Code Online (Sandbox Code Playgroud)

(我削减了追溯)

如果我取消注释,它会正常工作:

[2]
[2]
2
[2]
Run Code Online (Sandbox Code Playgroud)

我只在Windows上测试过它与'numexpr'完全相同而不是'numpy'.

Tho*_*eau 2

该对象Mult在创建时没有字段。因此可以用库存pickle库对其进行腌制。然后,当您调用 时lambdify,您_lambdify将向包含表达式的对象添加一个属性lambda,该属性无法被 pickle。map这会导致功能失败

这解释了为什么在调用之前lambdify您可以腌制对象并使用Pool.map以及为什么它在调用后失败。当您取消注释 中的行时lambdify,您不会将该属性添加到类中,并且Mult在调用 后仍然可以对对象进行 pickle lambdify