Python 使用numexpr创建可调用的

Python 使用numexpr创建可调用的,python,numpy,sympy,numexpr,Python,Numpy,Sympy,Numexpr,我正在用sympy做一些符号数学,然后使用eval和sympy的lambdastr实用程序生成一个Python lambda函数。这里有一个简单的例子来说明我的意思: import sympy import numpy as np from sympy.utilities.lambdify import lambdastr # simple example expression (my use-case is more complex) expr = sympy.S('b*sqrt(a) -

我正在用sympy做一些符号数学,然后使用
eval
和sympy的
lambdastr
实用程序生成一个Python lambda函数。这里有一个简单的例子来说明我的意思:

import sympy
import numpy as np
from sympy.utilities.lambdify import lambdastr

# simple example expression (my use-case is more complex)
expr = sympy.S('b*sqrt(a) - a**2')
a, b = sorted(expr.free_symbols, key=lambda s: s.name)

func = eval(lambdastr((a,b), expr), dict(sqrt=np.sqrt))

# call func on some numpy arrays
foo, bar = np.random.random((2, 4))
print func(foo, bar)
这是可行的,但我不喜欢使用
eval
,而且sympy不一定生成计算效率高的代码。相反,我想使用
numexpr
,它似乎非常适合这个用例:

import numexpr
print numexpr.evaluate(str(expr), local_dict=dict(a=foo, b=bar))
唯一的问题是我想生成一个可调用的函数(比如
func
lambda),而不是每次都调用
numexpr.evaluate
。这可能吗?

您可以使用该模块,该模块允许您将SymPy表达式转换为lambda函数,以实现高效计算。这很好,因为它能够返回带有附加实现的函数

Lambdify
ing您自己的函数可能如下所示:

func = lambdify((a,b),expr, dict(sqrt=np.sqrt))

我不确定我是否同意这里的要求。。。但是你不能把
numexpr.evaluate
调用包装成
lambda
函数吗?我想我可以,但这会导致每次求值时重新解析表达式字符串的成本吗?你能吗?哦,哇,我完全错过了
lambdify
。如果你回答这个问题,我会接受的。谢谢numexpr表达式是缓存的,因此重用很快:效果很好,尽管您不需要
expr
周围的参数。谢谢