首页 文章

如何序列化sympy lambdified函数?

提问于
浏览
7

Headers 说明了一切 . 有没有办法序列化sympy.lambdify生成的函数?:

import sympy as sym
import pickle
import dill
a, b = sym.symbols("a, b")
expr = sym.sin(a) + sym.cos(b)
lambdified_expr = sym.lambdify((a, b), expr, modules="numpy")
pickle.dumps(lambdified_expr) # won't work
dill.dumps(lambdified_expr) # won't work either

...我想这样做的原因是因为我的代码生成了很多lambdified函数,但我发现它每次都需要很长时间 .

2 回答

  • 3

    你实际上可以使用 dill 来腌制它 . dill 的最新版本(例如在github上)具有"settings",它允许在 dump 上构造pickle的变体 . 是的, dill 的默认设置在此对象上失败,但如果使用递归跟踪全局引用的设置(即 recurse = True )则不会失败 . 此设置类似于默认情况下 cloudpickle 为您提供的设置 .

    >>> 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\x00<string>t\x08\x00\x00\x00<lambda>\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\x08<lambda>q\nNN}q\x0btq\x0cRq\r.'
    

    附:我是 dill 作者,所以我知道 .

  • 7

    确实 - pickle,cPickle,甚至莳萝都在这个例子中使用默认设置失败 .

    但cloudpickle不会失败!

    pip install cloudpickle
    

    要么

    https://github.com/cloudpipe/cloudpickle

    import sympy as sym
    from cloudpickle import dumps, loads
    a, b = sym.symbols("a, b")
    expr = sym.sin(a) + sym.cos(b)
    lambdified_expr = sym.lambdify((a, b), expr, modules="numpy")
    var=dumps(lambdified_expr)
    a1=lambdified_expr(10,10)
    del lambdified_expr
    lambdified_expr=loads(var)
    a2=lambdified_expr(10,10)
    a1==a2  # True
    

相关问题