有没有办法序列化一个sympy ufuncify-ied函数?

时间:2017-11-16 14:14:04

标签: python serialization sympy numpy-ufunc

有没有办法使用SymPy的自动装配模块中的ufuncify工具序列化或保存已经二值化的函数?

这里有一个使用dillHow to serialize sympy lambdified function?的解决方案,但这只适用于lambdified函数。

这是一个简单的工作示例来说明:

>>> import pickle
>>> import dill
>>> import numpy
>>> from sympy import *
>>> from sympy.utilities.autowrap import ufuncify

>>> x, y, z = symbols('x y z')
>>> fx = ufuncify([x], sin(x))

>>> dill.settings['recurse'] = True
>>> dill.detect.errors(fx)
pickle.PicklingError("Can't pickle <ufunc 'wrapper_module_0'>: it's not found as __main__.wrapper_module_0")

动机:我有一些 5000万字符长的 SymPy表达式,我想加快速度; ufuncify效果非常好(仅比lambidfy提高了三个数量级),但每个表达式需要3小时ufuncify。我希望能够不时地利用ufuncify - 表达式(无需等待一天重新处理它们)。 更新:为了说明,计算机进入睡眠状态会杀死我的python内核,现在我需要等待~10小时才能恢复二进制化函数

1 个答案:

答案 0 :(得分:0)

知道了。这实际上比使用dill / pickle更简单,因为autowrap模块生成并编译C代码(默认情况下),可以作为C扩展模块导入[ 1] [2]。

保存生成代码的一种方法是简单地指定autowrap [3]的临时目录,例如:

Python环境1:

import numpy
from sympy import *
from sympy.utilities.autowrap import ufuncify

x, y, z = symbols('x y z')
fx = ufuncify([x], sin(x), tempdir='tmp')

Python环境2(相同的根目录):

import sys
sys.path.append('tmp')
import wrapper_module_0

wrapper_module_0.wrapped_8859643136(1)

可能有更好的方法(例如,是否有一种简单的方法来命名模块及其嵌入式功能?),但这现在可以使用。

[1] http://www.scipy-lectures.org/advanced/interfacing_with_c/interfacing_with_c.html

[2] https://docs.python.org/2/extending/extending.html

[3] http://docs.sympy.org/latest/modules/utilities/autowrap.html