2017-11-16 14 views
0

SymPyのautowrapモジュールのufuncifyツールを使用して2進化された関数をシリアル化または保存する方法はありますか?sympyのufuncify-ied関数をシリアル化する方法はありますか?

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

動機:I持っているいくつかの50百万文字-長い私がスピードアップしたい SymPy表現。 ufuncifyは素晴らしく機能します(lambidfy単独では3桁の改善)が、それぞれの表現にはufuncifyまで3時間かかります。私は随時、ufuncifyが付いている表現を利用できるようにしたいと考えています。 更新:コンピュータがスリープ状態になって、私のPythonカーネルが壊れてしまったので、2進化された関数を回復するのに〜10時間待つ必要があります。

答えて

0

autowrapモジュールは、C拡張モジュール[1] [2]としてインポートできるCコード(デフォルト)を生成してコンパイルするので、実際にはdill/pickleを使用するより簡単です。

生成されたコードを保存する1つの方法は、単に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

関連する問題