2017-11-16 13 views
0

SymPy의 autowrap 모듈에서 ufuncify 도구를 사용하여 이진화 된 함수를 직렬화하거나 저장하는 방법이 있습니까?sympy ufuncify-ied 함수를 직렬화하는 방법이 있습니까?

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") 

동기 부여 : I이 몇 50 만 문자 길이 내가 속도 싶습니다 SymPy 식; ufuncify은 놀랍게도 (lambidfy 이상으로 3 배 이상 향상되었지만) 각 표현마다 ufuncify까지 3 시간이 걸립니다. 나는 ufuncify - 수식을 활용할 수 있기를 바란다. (다시 처리하기 위해 하루를 기다리지 않고). 업데이트 : 설명을 위해 컴퓨터가 잠자기 모드로 전환하여 파이썬 커널을 죽였으므로 2 진수 기능을 복구하는 데 ~ 10 시간 정도 기다려야합니다.

답변

0

알립니다. autowrap 모듈은 C 확장 모듈 [1] [2]로 가져올 수있는 C 코드 (기본적으로)를 생성하고 컴파일하므로 실제로는 dill/pickle을 사용하는 것보다 간단합니다.

파이썬 환경 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') 

파이썬 환경 2 (동일한 루트 디렉토리)에 생성 된 코드를 저장하는

한 가지 방법은 단순히 autowrap [3], 예를 들면위한 임시 디렉토리를 지정하는 것입니다 :

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