有没有办法使用SymPy的自动装配模块中的ufuncify
工具序列化或保存已经二值化的函数?
这里有一个使用dill
:How 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小时才能恢复二进制化函数
答案 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