Python 保存一个 eval 函数
Python saving an eval function
假设我有一个函数 fun(f, x, y)
,其中 x 和 y 是数字,f 是指定函数的字符串,例如 "1 / x ** 2 + y"
.
我希望经常使用此功能f
,说几百万次,并且 x
和 y
的值在每次使用之间发生变化。
因此调用 eval(f)
与每次只计算函数值相比需要花费大量时间。 (在我测量的情况下,大约是 50 倍。)
有什么方法可以保存这个函数 f
以便我只需要调用 eval
一次吗?
PS. 请不要在这里讨论使用 eval
的(不)安全性,我知道,但这段代码不是不会去任何第 3 方 运行 它的地方,也与我的问题无关。
您可以 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
,但我可以根据需要多次更改 x
和 y
,而无需再次计算表达式。
如果Jean_Francois'的解决方案还是不够快,你可以看看numba。 f_numba = jit(f)
,然后可能还@jit 调用 f_numba 的函数,以便 f_numba 内联到调用者中。取决于您的应用程序。
假设我有一个函数 fun(f, x, y)
,其中 x 和 y 是数字,f 是指定函数的字符串,例如 "1 / x ** 2 + y"
.
我希望经常使用此功能f
,说几百万次,并且 x
和 y
的值在每次使用之间发生变化。
因此调用 eval(f)
与每次只计算函数值相比需要花费大量时间。 (在我测量的情况下,大约是 50 倍。)
有什么方法可以保存这个函数 f
以便我只需要调用 eval
一次吗?
PS. 请不要在这里讨论使用 eval
的(不)安全性,我知道,但这段代码不是不会去任何第 3 方 运行 它的地方,也与我的问题无关。
您可以 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
,但我可以根据需要多次更改 x
和 y
,而无需再次计算表达式。
如果Jean_Francois'的解决方案还是不够快,你可以看看numba。 f_numba = jit(f)
,然后可能还@jit 调用 f_numba 的函数,以便 f_numba 内联到调用者中。取决于您的应用程序。