Python保存eval函数

6
假设我有一个函数fun(f, x, y),其中x和y是数字,f是指定函数的字符串,例如"1 / x ** 2 + y"
我希望经常使用这个函数f,比如说几百万次,而且每次使用时xy的值都会改变。
因此,调用eval(f)需要相当长的时间,而不是每次计算函数的值。(在我的测试中大约慢了50倍。)
有没有办法保存这个函数f,这样我只需要调用一次eval呢?
PS.请不要在这里讨论使用eval的(不)安全性,我知道这一点,但这段代码不会运行在任何第三方可以运行它的地方,也与我的问题无关。

4
为什么需要将函数存储为字符串? - Arya McCarthy
它将由用户输入。 - Torn
另一个选择是将表达式预编译为代码对象,但Jean-François的技术几乎快了一倍。 - PM 2Ring
2个回答

9

您可以使用eval函数对lambda表达式进行求值,这样你只需一次求值,之后就可以将其作为一个可用的函数:

s = "1 / x ** 2 + y"

s = "lambda x,y: "+s
f = eval(s)
x = 2
y = 3
print(f(x,y))

我可以得到3.25,但我可以随时更改xy而不需要重新计算表达式。

0
如果Jean_Francois的解决方案仍然不够快,您可以看一下numba。 f_numba = jit(f),然后可能还要在调用f_numba的函数上使用@jit,以便将f_numba内联到调用者中。这取决于您的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接