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

  • 为什么它是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/

    10-12 19:30