2017-05-04 123 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很多次我不需要再次評估表達式。