lambdify
を使用して生成された数値コードを高速化しようとしていますnumexpr
。残念ながら、ベースの関数は、サポートされている関数の 1 つであるにもかかわらず、関数numexpr
を使用すると壊れます。sqrt
これは私の問題を再現します:
import sympy
import numpy as np
import numexpr
from sympy.utilities.lambdify import lambdify
expr = sympy.S('b*sqrt(a) - a**2')
a, b = sorted(expr.free_symbols, key=lambda s: s.name)
func_numpy = lambdify((a,b), expr, modules=[np], dummify=False)
func_numexpr = lambdify((a,b), expr, modules=[numexpr], dummify=False)
foo, bar = np.random.random((2, 4))
print sympy.__version__
print func_numpy(foo, bar)
print func_numexpr(foo, bar)
これを実行すると、出力は次のようになります。
0.7.6
[-0.02062061 0.08648306 -0.57868128 0.27598245]
Traceback (most recent call last):
File "sympy_test.py", line 17, in <module>
print func_numexpr(foo, bar)
File "<string>", line 1, in <lambda>
NameError: global name 'sqrt' is not defined
サニティチェックとして、numexpr
直接電話してみました:
numexpr.evaluate('b*sqrt(a) - a**2', local_dict=dict(a=foo, b=bar))
これは期待どおりに機能し、 と同じ結果になりfunc_numpy
ます。
編集:次の行を使用すると機能します:
func_numexpr = lambdify((a,b), expr, modules=['numexpr'], dummify=False)
これは sympy バグですか?