2017-05-04 95 views
6

说我有一个函数fun(f, x, y)其中x和y是数字,f是一个字符串,指定一个函数,如"1/x ** 2 + y"Python保存评估函数

我希望使用这个函数f很多,说几百万次,并且值的xy在每次使用之间改变。
因此调用eval(f)需要大量的时间,而不是每次只计算函数的值。 (在我测量的情况下约为50x。)

有什么办法可以保存这个功能f这样我只需要拨打eval一次?

PS。请不要在这里讨论使用eval的(un)安全性,我意识到这一点,但是这个代码不会在第三方运行它的任何地方,也不会与我的问题相关。

+4

为什么你需要将函数存储为字符串? –

+0

它将由用户输入。 – Torn

+0

另一种方法是将表达式编译为代码对象(https://docs.python.org/3/library/functions.html#compile),但Jean-François的技术几乎快两倍。 –

回答

9

你可以evallambda,所以你只要评估一次,之后,它是一个功能,您可以使用:

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

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

我得到3.25,但我可以改变xy很多次我不需要再次评估表达式。