2017-05-04 3 views
6

私は関数fun(f, x, y)を持ちます。ここで、xとyは数字で、fは"1/x ** 2 + y"のような関数を指定する文字列です。Pythonはeval関数を保存します

fを数百万回使用したいと考えており、それぞれの使用の間にxyという値が変わります。
したがって、毎回関数の値を計算するのではなく、eval(f)を呼び出すとかなりの時間がかかります。 (私の測定したケースで約50倍)

fこの機能を保存する方法はありますか?evalを一度呼び出すだけです。

PS。ここではevalの安全性については言及していませんが、私はそれを認識していますが、このコードは第三者が実行する場所ではなく、私の質問にも関係しません。

+4

なぜ関数を文字列として格納する必要がありますか? –

+0

ユーザーが入力します。 – Torn

+0

もう一つの選択肢は、あなたの式をコードオブジェクトにプリコンパイルすることですが、Jean-Françoisの手法はほぼ2倍の速さです。 –

答えて

9

あなたは一度だけ、それを評価するようにするには、lambdaevalことができ、その後、それはあなたが使用できる機能です:私は3.25を得る

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

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

が、私は、私はxy何度でも変更することができます式を再度評価する必要はありません。

関連する問題