How to serialize sympy lambdified function?

后端 未结 2 601
春和景丽
春和景丽 2020-12-17 23:41

The title says it all. Is there any way to serialize a function generated by sympy.lambdify?:

import sympy as sym
import pickle
import dill
a, b = sym.symbol         


        
2条回答
  •  春和景丽
    2020-12-18 00:09

    You actually can use dill to pickle it. The most recent versions of dill (e.g. on github) has "settings" that allow variants of how the pickle is constructed on dump. Yes, the default settings for dill fail on this object, but not if you use the setting that recursively traces global references (i.e. recurse = True). This setting is similar to what cloudpickle gives you by default.

    >>> import sympy as sym
    >>> import pickle
    >>> import dill
    >>> a, b = symbols("a, b")
    >>> a, b = sym.symbols("a, b")
    >>> expr = sym.sin(a) + sym.cos(b)
    >>> lambdified_expr = sym.lambdify((a, b), expr, modules="numpy")
    >>> 
    >>> dill.settings
    {'recurse': False, 'byref': False, 'protocol': 2, 'fmode': 0}
    >>> dill.settings['recurse'] = True
    >>> dill.dumps(lambdified_expr)
    '\x80\x02cdill.dill\n_create_function\nq\x00(cdill.dill\n_unmarshal\nq\x01U\x83c\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00C \x00\x00s\x14\x00\x00\x00t\x00\x00|\x00\x00\x83\x01\x00t\x01\x00|\x01\x00\x83\x01\x00\x17S(\x01\x00\x00\x00N(\x02\x00\x00\x00t\x03\x00\x00\x00sint\x03\x00\x00\x00cos(\x02\x00\x00\x00t\x01\x00\x00\x00at\x01\x00\x00\x00b(\x00\x00\x00\x00(\x00\x00\x00\x00s\x08\x00\x00\x00t\x08\x00\x00\x00\x01\x00\x00\x00s\x00\x00\x00\x00q\x02\x85q\x03Rq\x04}q\x05(U\x03cosq\x06cnumpy.core.umath\ncos\nq\x07U\x03sinq\x08cnumpy.core.umath\nsin\nq\tuU\x08q\nNN}q\x0btq\x0cRq\r.'
    

    P.S. I'm the dill author, so I'd know.

提交回复
热议问题