0

有没有办法序列化或保存使用ufuncifySymPy 自动包装模块中的工具进行二值化的函数?

这里有一个解决方案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),但ufuncify每个表达式需要 3 小时。我希望能够不时利用ufuncify-ied 表达式(无需等待一天重新处理它们)。更新:为了说明,计算机进入睡眠状态杀死了我的 python 内核,现在我需要等待大约 10 小时才能恢复二进制化函数

4

1 回答 1

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

于 2017-11-16T17:10:22.070 回答